diff --git a/README.md b/README.md index 61b89b0..9f93949 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,8 @@ +# توقف فعالیت در گیت‌هاب به دلیل نگرانی‌های اخلاقی +ما به دلیل استفاده مایکروسافت از هوش مصنوعی در تولید سلاح‌های نظامی و آموزش مدل‌های هوش مصنوعی با داده‌های غیرنظامیان، تصمیم گرفتیم تمام فعالیت‌های خود را در پلتفرم گیت‌هاب متوقف کنیم. این تصمیم به منظور پایبندی به اصول اخلاقی و مسئولیت اجتماعی اتخاذ شده است. +برای دسترسی به سورس‌کدها و مشارکت در پروژه‌های ما، لطفاً به وب‌سایت رسمی ما به آدرس [source.hesabix.ir](https://source.hesabix.ir) مراجعه کنید. +با تشکر از حمایت و همراهی شما. + # حسابیکس - نرم‌افزار حسابداری متن‌باز Hesabix Logo diff --git a/hesabixCore/composer.json b/hesabixCore/composer.json index 9140ee6..66aedb9 100644 --- a/hesabixCore/composer.json +++ b/hesabixCore/composer.json @@ -23,6 +23,7 @@ "phpoffice/phpspreadsheet": "^2.3", "phpstan/phpdoc-parser": "^1.33", "ramsey/uuid": "^4.7", + "snapp-market-pro/moadian": "^1.1", "symfony/apache-pack": "^1.0", "symfony/asset": "7.2.*", "symfony/console": "7.2.*", @@ -109,7 +110,7 @@ "symfony/browser-kit": "7.2.*", "symfony/css-selector": "7.2.*", "symfony/debug-bundle": "7.2.*", - "symfony/maker-bundle": "^1.62", + "symfony/maker-bundle": "^1.64", "symfony/phpunit-bridge": "^7.2", "symfony/stopwatch": "7.2.*", "symfony/web-profiler-bundle": "7.2.*" diff --git a/hesabixCore/composer.lock b/hesabixCore/composer.lock index 95cb481..fa625a3 100644 --- a/hesabixCore/composer.lock +++ b/hesabixCore/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "389f897ebd1e0befdd15876e5d6a43a7", + "content-hash": "43db0ad2bb94569ed6d44cabf503210e", "packages": [ { "name": "brick/math", @@ -1563,6 +1563,331 @@ ], "time": "2025-03-06T22:45:56+00:00" }, + { + "name": "guzzlehttp/guzzle", + "version": "7.9.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", + "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.3", + "guzzlehttp/psr7": "^2.7.0", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.9.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2025-03-27T13:37:11+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/7c69f28996b0a6920945dd20b3857e499d9ca96c", + "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.2.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2025-03-27T13:27:01+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.7.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/c2270caaabe631b3b44c85f99e5a04bbb8060d16", + "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.7.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2025-03-27T12:30:47+00:00" + }, { "name": "maennchen/zipstream-php", "version": "3.1.2", @@ -2447,6 +2772,73 @@ }, "time": "2024-12-30T11:07:19+00:00" }, + { + "name": "paragonie/constant_time_encoding", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "df1e7fde177501eee2037dd159cf04f5f301a512" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/df1e7fde177501eee2037dd159cf04f5f301a512", + "reference": "df1e7fde177501eee2037dd159cf04f5f301a512", + "shasum": "" + }, + "require": { + "php": "^8" + }, + "require-dev": { + "phpunit/phpunit": "^9", + "vimeo/psalm": "^4|^5" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" + }, + "time": "2024-05-08T12:36:18+00:00" + }, { "name": "paragonie/random_compat", "version": "v9.99.100", @@ -2777,6 +3169,116 @@ }, "time": "2025-02-08T03:01:45+00:00" }, + { + "name": "phpseclib/phpseclib", + "version": "3.0.46", + "source": { + "type": "git", + "url": "https://github.com/phpseclib/phpseclib.git", + "reference": "56483a7de62a6c2a6635e42e93b8a9e25d4f0ec6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/56483a7de62a6c2a6635e42e93b8a9e25d4f0ec6", + "reference": "56483a7de62a6c2a6635e42e93b8a9e25d4f0ec6", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1|^2|^3", + "paragonie/random_compat": "^1.4|^2.0|^9.99.99", + "php": ">=5.6.1" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "suggest": { + "ext-dom": "Install the DOM extension to load XML formatted public keys.", + "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", + "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", + "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + }, + "type": "library", + "autoload": { + "files": [ + "phpseclib/bootstrap.php" + ], + "psr-4": { + "phpseclib3\\": "phpseclib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "role": "Lead Developer" + }, + { + "name": "Patrick Monnerat", + "email": "pm@datasphere.ch", + "role": "Developer" + }, + { + "name": "Andreas Fischer", + "email": "bantu@phpbb.com", + "role": "Developer" + }, + { + "name": "Hans-Jürgen Petrich", + "email": "petrich@tronic-media.com", + "role": "Developer" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "role": "Developer" + } + ], + "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", + "homepage": "http://phpseclib.sourceforge.net", + "keywords": [ + "BigInteger", + "aes", + "asn.1", + "asn1", + "blowfish", + "crypto", + "cryptography", + "encryption", + "rsa", + "security", + "sftp", + "signature", + "signing", + "ssh", + "twofish", + "x.509", + "x509" + ], + "support": { + "issues": "https://github.com/phpseclib/phpseclib/issues", + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.46" + }, + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], + "time": "2025-06-26T16:29:55+00:00" + }, { "name": "phpstan/phpdoc-parser", "version": "1.33.0", @@ -3341,6 +3843,50 @@ }, "time": "2021-10-29T13:26:27+00:00" }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, { "name": "ramsey/collection", "version": "2.1.1", @@ -3646,6 +4192,65 @@ ], "time": "2025-02-05T13:22:35+00:00" }, + { + "name": "snapp-market-pro/moadian", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/Snapp-Market-Pro/moadian.git", + "reference": "cf178ea7a0f6830c25fc636c9d2e8f0d871b6158" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Snapp-Market-Pro/moadian/zipball/cf178ea7a0f6830c25fc636c9d2e8f0d871b6158", + "reference": "cf178ea7a0f6830c25fc636c9d2e8f0d871b6158", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "guzzlehttp/guzzle": "^7.5", + "php": "^8.0", + "phpseclib/phpseclib": "~3.0", + "ramsey/uuid": "^4.7" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.17", + "monolog/monolog": "^3.3", + "phpunit/phpunit": "^10.0", + "symfony/var-dumper": "^6.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "SnappMarketPro\\Moadian\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ali Rahimi", + "email": "arahimihajiabadi@gmail.com" + }, + { + "name": "Amir Reza Mehbakhsh", + "email": "theamirrezam75@gmail.com" + }, + { + "name": "Soheil Yousefi", + "email": "myparstik@gmail.com" + } + ], + "description": "PHP SDK for working with tp.tax.gov.ir (سامانه مودیان مالیاتی)", + "support": { + "issues": "https://github.com/Snapp-Market-Pro/moadian/issues", + "source": "https://github.com/Snapp-Market-Pro/moadian/tree/1.1.1" + }, + "abandoned": true, + "time": "2023-11-07T20:19:53+00:00" + }, { "name": "symfony/apache-pack", "version": "v1.0.1", @@ -11063,21 +11668,21 @@ }, { "name": "symfony/maker-bundle", - "version": "v1.62.1", + "version": "v1.64.0", "source": { "type": "git", "url": "https://github.com/symfony/maker-bundle.git", - "reference": "468ff2708200c95ebc0d85d3174b6c6711b8a590" + "reference": "c86da84640b0586e92aee2b276ee3638ef2f425a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/468ff2708200c95ebc0d85d3174b6c6711b8a590", - "reference": "468ff2708200c95ebc0d85d3174b6c6711b8a590", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/c86da84640b0586e92aee2b276ee3638ef2f425a", + "reference": "c86da84640b0586e92aee2b276ee3638ef2f425a", "shasum": "" }, "require": { "doctrine/inflector": "^2.0", - "nikic/php-parser": "^4.18|^5.0", + "nikic/php-parser": "^5.0", "php": ">=8.1", "symfony/config": "^6.4|^7.0", "symfony/console": "^6.4|^7.0", @@ -11100,6 +11705,7 @@ "symfony/http-client": "^6.4|^7.0", "symfony/phpunit-bridge": "^6.4.1|^7.0", "symfony/security-core": "^6.4|^7.0", + "symfony/security-http": "^6.4|^7.0", "symfony/yaml": "^6.4|^7.0", "twig/twig": "^3.0|^4.x-dev" }, @@ -11135,7 +11741,7 @@ ], "support": { "issues": "https://github.com/symfony/maker-bundle/issues", - "source": "https://github.com/symfony/maker-bundle/tree/v1.62.1" + "source": "https://github.com/symfony/maker-bundle/tree/v1.64.0" }, "funding": [ { @@ -11151,7 +11757,7 @@ "type": "tidelift" } ], - "time": "2025-01-15T00:21:40+00:00" + "time": "2025-06-23T16:12:08+00:00" }, { "name": "symfony/phpunit-bridge", @@ -11370,7 +11976,7 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": true, "prefer-lowest": false, "platform": { @@ -11380,6 +11986,6 @@ "ext-fileinfo": "*", "ext-iconv": "*" }, - "platform-dev": [], + "platform-dev": {}, "plugin-api-version": "2.6.0" } diff --git a/hesabixCore/migrations/.gitignore b/hesabixCore/migrations/.gitignore deleted file mode 100644 index e69de29..0000000 diff --git a/hesabixCore/migrations/.idea/.gitignore b/hesabixCore/migrations/.idea/.gitignore deleted file mode 100644 index 13566b8..0000000 --- a/hesabixCore/migrations/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/hesabixCore/migrations/.idea/deployment.xml b/hesabixCore/migrations/.idea/deployment.xml deleted file mode 100644 index 4a67929..0000000 --- a/hesabixCore/migrations/.idea/deployment.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/hesabixCore/migrations/.idea/hesabixCore.iml b/hesabixCore/migrations/.idea/hesabixCore.iml deleted file mode 100644 index 705b269..0000000 --- a/hesabixCore/migrations/.idea/hesabixCore.iml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/hesabixCore/migrations/.idea/modules.xml b/hesabixCore/migrations/.idea/modules.xml deleted file mode 100644 index cda9d1c..0000000 --- a/hesabixCore/migrations/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/hesabixCore/migrations/.idea/php.xml b/hesabixCore/migrations/.idea/php.xml deleted file mode 100644 index ac98341..0000000 --- a/hesabixCore/migrations/.idea/php.xml +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/hesabixCore/migrations/.idea/symfony2.xml b/hesabixCore/migrations/.idea/symfony2.xml deleted file mode 100644 index 3298060..0000000 --- a/hesabixCore/migrations/.idea/symfony2.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/hesabixCore/migrations/.idea/vcs.xml b/hesabixCore/migrations/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/hesabixCore/migrations/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/hesabixCore/src/Controller/CommodityController.php b/hesabixCore/src/Controller/CommodityController.php index f7ba64e..3415fdf 100644 --- a/hesabixCore/src/Controller/CommodityController.php +++ b/hesabixCore/src/Controller/CommodityController.php @@ -264,6 +264,9 @@ class CommodityController extends AbstractController 'floatNumber' => $item->getUnit()->getFloatNumber(), ]; $temp['barcodes'] = $item->getBarcodes(); + $temp['taxCode'] = $item->getTaxCode(); + $temp['taxType'] = $item->getTaxType(); + $temp['taxUnit'] = $item->getTaxUnit(); //calculate count if ($item->isKhadamat()) { $temp['count'] = 0; @@ -328,6 +331,9 @@ class CommodityController extends AbstractController $temp['minOrderCount'] = $item->getMinOrderCount(); $temp['dayLoading'] = $item->getDayLoading(); $temp['orderPoint'] = $item->getOrderPoint(); + $temp['taxCode'] = $item->getTaxCode(); + $temp['taxType'] = $item->getTaxType(); + $temp['taxUnit'] = $item->getTaxUnit(); //calculate count if ($item->isKhadamat()) { $temp['count'] = 0; @@ -419,8 +425,11 @@ class CommodityController extends AbstractController $temp['commodityCountCheck'] = $item->isCommodityCountCheck(); $temp['minOrderCount'] = $item->getMinOrderCount(); $temp['dayLoading'] = $item->getDayLoading(); - $temp['orderPoint'] = $item->getOrderPoint(); - //calculate count + $temp['orderPoint'] = $item->getOrderPoint(); + $temp['taxCode'] = $item->getTaxCode(); + $temp['taxType'] = $item->getTaxType(); + $temp['taxUnit'] = $item->getTaxUnit(); + //calculate count if ($item->isKhadamat()) { $temp['count'] = 0; } else { @@ -732,6 +741,18 @@ class CommodityController extends AbstractController $data->setBarcodes($params['barcodes']); } + if (array_key_exists('taxCode', $params)) { + $data->setTaxCode($params['taxCode']); + } + + if (array_key_exists('taxType', $params)) { + $data->setTaxType($params['taxType']); + } + + if (array_key_exists('taxUnit', $params)) { + $data->setTaxUnit($params['taxUnit']); + } + if (array_key_exists('minOrderCount', $params)) { $data->setMinOrderCount($params['minOrderCount']); } @@ -863,6 +884,18 @@ class CommodityController extends AbstractController $data->setBarcodes($params['barcodes']); } + if (array_key_exists('taxCode', $params)) { + $data->setTaxCode($params['taxCode']); + } + + if (array_key_exists('taxType', $params)) { + $data->setTaxType($params['taxType']); + } + + if (array_key_exists('taxUnit', $params)) { + $data->setTaxUnit($params['taxUnit']); + } + if (array_key_exists('minOrderCount', $params)) { $data->setMinOrderCount($params['minOrderCount']); } @@ -1304,6 +1337,12 @@ class CommodityController extends AbstractController $commodity->setMinOrderCount($item[5]); if (array_key_exists(6, $item)) $commodity->setDes($item[6]); + if (array_key_exists(9, $item)) + $commodity->setTaxCode($item[9]); + if (array_key_exists(10, $item)) + $commodity->setTaxType($item[10]); + if (array_key_exists(11, $item)) + $commodity->setTaxUnit($item[11]); if (array_key_exists(0, $item)) { $commodity->setKhadamat(true); if ($item[0] == '1') { diff --git a/hesabixCore/src/Controller/Plugins/TaxSettingsController.php b/hesabixCore/src/Controller/Plugins/TaxSettingsController.php index 9e0d2e4..b7fdd18 100644 --- a/hesabixCore/src/Controller/Plugins/TaxSettingsController.php +++ b/hesabixCore/src/Controller/Plugins/TaxSettingsController.php @@ -12,9 +12,20 @@ use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Annotation\Route; use App\Entity\PluginTaxsettingsKey; +use App\Entity\HesabdariDoc; +use App\Entity\PluginTaxInvoice; +use DateTime; +use DateInterval; class TaxSettingsController extends AbstractController { + + private function getMoadianBaseUrl(registryMGR $registryMGR): string + { + $sandboxMode = filter_var($registryMGR->get('system_settings', 'tax_system_sandbox_mode'), FILTER_VALIDATE_BOOLEAN); + return $sandboxMode ? 'https://sandboxrc.tax.gov.ir/' : 'https://tp.tax.gov.ir/'; + } + #[Route('/api/plugins/tax/settings/get', name: 'plugin_tax_settings_get', methods: ['GET'])] public function plugin_tax_settings_get(EntityManagerInterface $em, Access $access): JsonResponse { @@ -24,9 +35,9 @@ class TaxSettingsController extends AbstractController } $businessId = is_object($acc['bid']) ? $acc['bid']->getId() : $acc['bid']; - $userId = $this->getUser()->getId(); + $user = $this->getUser(); + $userId = $user instanceof \App\Entity\User ? $user->getId() : null; - // دریافت تنظیمات از جدول اختصاصی $repo = $em->getRepository(PluginTaxsettingsKey::class); $entity = $repo->findOneBy(['business_id' => $businessId, 'user_id' => $userId]); @@ -49,21 +60,21 @@ class TaxSettingsController extends AbstractController $params = $request->getPayload()->all(); $businessId = is_object($acc['bid']) ? $acc['bid']->getId() : $acc['bid']; - $userId = $this->getUser()->getId(); + $user = $this->getUser(); + $userId = $user instanceof \App\Entity\User ? $user->getId() : null; - // بررسی وجود رکورد قبلی $repo = $em->getRepository(PluginTaxsettingsKey::class); $entity = $repo->findOneBy(['business_id' => $businessId, 'user_id' => $userId]); if (!$entity) { $entity = new PluginTaxsettingsKey(); $entity->setBusinessId($businessId); $entity->setUserId($userId); - $entity->setCreatedAt(new \DateTime()); + $entity->setCreatedAt(new DateTime()); } $entity->setPrivateKey($params['privateKey'] ?? ''); $entity->setTaxMemoryId($params['taxMemoryId'] ?? null); $entity->setEconomicCode($params['economicCode'] ?? null); - $entity->setUpdatedAt(new \DateTime()); + $entity->setUpdatedAt(new DateTime()); $em->persist($entity); $em->flush(); @@ -75,40 +86,36 @@ class TaxSettingsController extends AbstractController private function generatePrivateKey(): string { - // تولید کلید خصوصی واقعی با OpenSSL $config = [ "private_key_bits" => 2048, "private_key_type" => OPENSSL_KEYTYPE_RSA, ]; - + $res = openssl_pkey_new($config); if (!$res) { throw new \Exception('خطا در تولید کلید خصوصی: ' . openssl_error_string()); } - + $privateKey = ''; if (!openssl_pkey_export($res, $privateKey)) { throw new \Exception('خطا در استخراج کلید خصوصی: ' . openssl_error_string()); } - - openssl_pkey_free($res); + return $privateKey; } private function generatePublicKey(string $privateKey): string { - // استخراج کلید عمومی از کلید خصوصی $res = openssl_pkey_get_private($privateKey); if (!$res) { throw new \Exception('خطا در خواندن کلید خصوصی: ' . openssl_error_string()); } - + $keyDetails = openssl_pkey_get_details($res); if (!$keyDetails) { throw new \Exception('خطا در استخراج جزئیات کلید: ' . openssl_error_string()); } - - openssl_pkey_free($res); + return $keyDetails['key']; } @@ -122,30 +129,47 @@ class TaxSettingsController extends AbstractController $params = $request->getPayload()->all(); - // بررسی فیلدهای اجباری - if (empty($params['nationalId']) || empty($params['nameFa']) || empty($params['nameEn']) || empty($params['email'])) { + $personType = $params['personType'] ?? 'natural'; + + if (empty($params['nationalId'])) { return $this->json([ 'success' => false, - 'message' => 'تمام فیلدها الزامی هستند' + 'message' => 'شناسه ملی الزامی است' ]); } + + if ($personType === 'legal') { + if (empty($params['nameFa']) || empty($params['nameEn']) || empty($params['email'])) { + return $this->json([ + 'success' => false, + 'message' => 'برای اشخاص حقوقی، تمام فیلدها الزامی هستند' + ]); + } + } try { $privateKey = $this->generatePrivateKey(); $publicKey = $this->generatePublicKey($privateKey); - $csr = $this->generateCSR($privateKey, $params); - - // هیچ ذخیره‌ای در دیتابیس انجام نمی‌شود + $businessId = is_object($acc['bid']) ? $acc['bid']->getId() : $acc['bid']; - $log->insert('تنظیمات مالیاتی', 'کلید و CSR تولید شد (بدون ذخیره)', $this->getUser(), $businessId); - - return $this->json([ + + $response = [ 'success' => true, - 'message' => 'کلید و CSR با موفقیت تولید شد', 'privateKey' => $privateKey, - 'publicKey' => $publicKey, - 'csr' => $csr - ]); + 'publicKey' => $publicKey + ]; + + if ($personType === 'legal') { + $csr = $this->generateCSR($privateKey, $params); + $response['csr'] = $csr; + $response['message'] = 'کلید و CSR با موفقیت تولید شد'; + $log->insert('تنظیمات مالیاتی', 'کلید و CSR تولید شد (بدون ذخیره)', $this->getUser(), $businessId); + } else { + $response['message'] = 'کلید با موفقیت تولید شد'; + $log->insert('تنظیمات مالیاتی', 'کلید خصوصی و عمومی تولید شد (بدون ذخیره)', $this->getUser(), $businessId); + } + + return $this->json($response); } catch (\Exception $e) { return $this->json([ 'success' => false, @@ -156,18 +180,17 @@ class TaxSettingsController extends AbstractController private function generateCSR(string $privateKey, array $params): string { - // تولید CSR واقعی با OpenSSL $dn = [ + "serialNumber" => $params['nationalId'], "countryName" => "IR", - "stateOrProvinceName" => "Tehran", - "localityName" => "Tehran", - "organizationName" => $params['nameEn'], - "organizationalUnitName" => "Tax Department", - "commonName" => $params['nameFa'], + "stateOrProvinceName" => "تهران", + "localityName" => "تهران", + "organizationName" => "Non-Governmental", + "organizationalUnitName" => $params['nameFa'], + "commonName" => $params['nameEn'] . " [Stamp]", "emailAddress" => $params['email'] ]; - // اضافه کردن شناسه ملی به عنوان extension $config = [ "req" => [ "distinguished_name" => $dn, @@ -180,7 +203,6 @@ class TaxSettingsController extends AbstractController ] ]; - // ایجاد CSR $res = openssl_csr_new($dn, $privateKey, [ 'config' => $config, 'digest_alg' => 'sha256', @@ -198,4 +220,1250 @@ class TaxSettingsController extends AbstractController return $csr; } -} \ No newline at end of file + + #[Route('/api/plugins/tax/list/send-invoice', name: 'plugin_tax_list_send_invoice', methods: ['POST'])] + public function plugin_tax_list_send_invoice(Request $request, Access $access, Log $log, EntityManagerInterface $em): JsonResponse + { + $acc = $access->hasRole('plugTaxSettings'); + if (!$acc) { + throw $this->createAccessDeniedException('شما دسترسی لازم را ندارید.'); + } + + $params = $request->getPayload()->all(); + $invoiceCodes = $params['codes'] ?? []; + + if (empty($invoiceCodes)) { + return $this->json([ + 'success' => false, + 'message' => 'کد فاکتور الزامی است' + ]); + } + + $businessId = is_object($acc['bid']) ? $acc['bid']->getId() : $acc['bid']; + $user = $this->getUser(); + $userId = $user instanceof \App\Entity\User ? $user->getId() : null; + + try { + $taxRepo = $em->getRepository(PluginTaxsettingsKey::class); + $taxSettings = $taxRepo->findOneBy([ + 'business_id' => $businessId, + 'user_id' => $userId + ]); + + if (!$taxSettings || !$taxSettings->getPrivateKey()) { + return $this->json([ + 'success' => false, + 'message' => 'تنظیمات مالیاتی تکمیل نشده است. لطفاً ابتدا تنظیمات را تکمیل کنید.' + ]); + } + + $invoiceRepo = $em->getRepository(HesabdariDoc::class); + $results = []; + $successCount = 0; + $errorCount = 0; + $processedCodes = []; + + foreach ($invoiceCodes as $invoiceCode) { + $invoiceCode = trim($invoiceCode); + if (empty($invoiceCode)) { + continue; + } + + try { + $invoice = $invoiceRepo->findOneBy([ + 'code' => $invoiceCode, + 'bid' => $businessId, + 'type' => 'sell' + ]); + + if (!$invoice) { + $results[] = [ + 'code' => $invoiceCode, + 'success' => false, + 'message' => 'فاکتور مورد نظر یافت نشد' + ]; + $errorCount++; + continue; + } + + $result = $this->saveInvoiceToSql($invoice, $taxSettings, $em, $businessId, $userId); + + if ($result['success']) { + $results[] = [ + 'code' => $invoiceCode, + 'success' => true, + 'message' => 'فاکتور با موفقیت به لیست ارسال اضافه شد', + 'data' => $result['data'] ?? null + ]; + $successCount++; + $processedCodes[] = $invoiceCode; + } else { + $results[] = [ + 'code' => $invoiceCode, + 'success' => false, + 'message' => $result['message'] ?? 'خطا در اضافه کردن به لیست ارسال' + ]; + $errorCount++; + } + } catch (\Exception $e) { + $results[] = [ + 'code' => $invoiceCode, + 'success' => false, + 'message' => 'خطا در پردازش فاکتور: ' . $e->getMessage() + ]; + $errorCount++; + } + } + + if (!empty($processedCodes)) { + $codesText = implode(', ', $processedCodes); + $log->insert('اضافه به لیست ارسال', 'فاکتورهای ' . $codesText . ' به لیست ارسال به سامانه مودیان اضافه شد', $this->getUser(), $businessId); + } + + $totalProcessed = count($invoiceCodes); + $message = "پردازش {$totalProcessed} فاکتور تکمیل شد. موفق: {$successCount}, ناموفق: {$errorCount}"; + + return $this->json([ + 'success' => true, + 'message' => $message, + 'summary' => [ + 'total' => $totalProcessed, + 'success' => $successCount, + 'error' => $errorCount + ], + 'results' => $results + ]); + + } catch (\Exception $e) { + $log->insert('خطا در اضافه به لیست ارسال', 'خطا در پردازش فاکتورها: ' . $e->getMessage(), $this->getUser(), $businessId); + + return $this->json([ + 'success' => false, + 'message' => 'خطا در پردازش فاکتورها: ' . $e->getMessage() + ]); + } + } + + private function saveInvoiceToSql($invoice, $taxSettings, $em, $businessId, $userId, $actualSend = false): array + { + try { + $taxInvoiceRepo = $em->getRepository(PluginTaxInvoice::class); + $existingRecord = $taxInvoiceRepo->findByInvoiceCodeAndBusiness($invoice->getCode(), $businessId); + + if ($existingRecord) { + return [ + 'success' => false, + 'message' => 'این فاکتور قبلاً به سامانه مودیان ارسال شده است.' + ]; + } + + $taxInvoice = new PluginTaxInvoice(); + $taxInvoice->setBusiness($em->getRepository(\App\Entity\Business::class)->find($businessId)); + $taxInvoice->setUser($em->getRepository(\App\Entity\User::class)->find($userId)); + $taxInvoice->setInvoice($invoice); + $taxInvoice->setInvoiceCode($invoice->getCode()); + $taxInvoice->setStatus('pending'); + + $customerName = null; + $customerId = null; + $rows = $invoice->getHesabdariRows(); + foreach ($rows as $row) { + if ($row->getPerson()) { + $customerName = $row->getPerson()->getNikename(); + $customerId = $row->getPerson()->getCode(); + break; + } + } + $taxInvoice->setCustomerName($customerName); + $taxInvoice->setCustomerId($customerId); + + $em->persist($taxInvoice); + $em->flush(); + + return [ + 'success' => true, + 'data' => [ + 'invoiceNumber' => $invoice->getCode(), + 'status' => 'pending', + 'message' => 'فاکتور با موفقیت به لیست ارسال اضافه شد' + ] + ]; + + } catch (\Exception $e) { + if (isset($taxInvoice)) { + $taxInvoice->setStatus('failed'); + $taxInvoice->setErrorMessage($e->getMessage()); + $em->flush(); + } + + return [ + 'success' => false, + 'message' => 'خطا در اضافه کردن به لیست ارسال: ' . $e->getMessage() + ]; + } + } + + #[Route('/api/plugins/tax/invoices/list', name: 'plugin_tax_settings_invoices_list', methods: ['GET'])] + public function plugin_tax_settings_invoices_list(Request $request, Access $access, EntityManagerInterface $em): JsonResponse + { + $acc = $access->hasRole('plugTaxSettings'); + if (!$acc) { + throw $this->createAccessDeniedException('شما دسترسی لازم را ندارید.'); + } + + $businessId = is_object($acc['bid']) ? $acc['bid']->getId() : $acc['bid']; + + try { + $taxInvoiceRepo = $em->getRepository(PluginTaxInvoice::class); + $invoices = $taxInvoiceRepo->findByBusiness($businessId); + + $result = []; + foreach ($invoices as $taxInvoice) { + $invoice = $taxInvoice->getInvoice(); + + $invoiceDetails = null; + if ($invoice) { + $invoiceDetails = [ + 'id' => $invoice->getId(), + 'code' => $invoice->getCode(), + 'date' => $invoice->getDate(), + 'des' => $invoice->getDes(), + 'amount' => $invoice->getAmount(), + 'type' => $invoice->getType(), + 'status' => $invoice->getStatus(), + 'shortlink' => $invoice->getShortlink(), + 'taxPercent' => $invoice->getTaxPercent(), + 'discountType' => $invoice->getDiscountType(), + 'discountPercent' => $invoice->getDiscountPercent() + ]; + } + + $result[] = [ + 'id' => $taxInvoice->getId(), + 'invoiceNumber' => $taxInvoice->getInvoiceCode(), + 'date' => $invoice ? $invoice->getDate() : null, + 'customerName' => $taxInvoice->getCustomerName(), + 'customerId' => $taxInvoice->getCustomerId(), + 'totalAmount' => $taxInvoice->getAmount(), + 'status' => $taxInvoice->getStatus(), + 'sentDate' => $taxInvoice->getSentAt() ? $taxInvoice->getSentAt()->format('Y-m-d H:i:s') : null, + 'errorMessage' => $taxInvoice->getErrorMessage(), + 'createdAt' => $taxInvoice->getCreatedAt()->format('Y-m-d H:i:s'), + 'uniqueTaxNumber' => $taxInvoice->getTaxSystemInvoiceNumber(), + 'referenceUniqueTaxNumber' => $taxInvoice->getTaxSystemReferenceNumber(), + 'invoiceType' => $taxInvoice->getInvoiceType(), + 'invoiceDetails' => $invoiceDetails + ]; + } + + return $this->json([ + 'success' => true, + 'data' => $result + ]); + + } catch (\Exception $e) { + return $this->json([ + 'success' => false, + 'message' => 'خطا در دریافت لیست فاکتورها: ' . $e->getMessage() + ]); + } + } + + private function base64UrlEncode(string $data): string + { + return rtrim(strtr(base64_encode($data), '+/', '-_'), '='); + } + + private function extractInvoiceData($doc): array + { + try { + $person = null; + $discountAll = 0; + $transferCost = 0; + $items = []; + $totalInvoice = 0; + $taxPercent = $doc->getTaxPercent() ? (float) $doc->getTaxPercent() / 100 : 0; + $discountType = $doc->getDiscountType() ?? 'fixed'; + $discountPercent = $doc->getDiscountPercent() ?? 0; + $payments = []; + + $relatedDocs = $doc->getRelatedDocs(); + + foreach ($relatedDocs as $relatedDoc) { + if ($relatedDoc->getType() === 'sell_receive') { + $payment = [ + 'type' => null, + 'amount' => $relatedDoc->getAmount(), + 'reference' => '', + 'description' => $relatedDoc->getDes(), + 'bank' => null, + 'cashdesk' => null, + 'salary' => null + ]; + + foreach ($relatedDoc->getHesabdariRows() as $row) { + if ($row->getBank()) { + $payment['type'] = 'bank'; + $payment['bank'] = $row->getBank()->getId(); + } elseif ($row->getCashdesk()) { + $payment['type'] = 'cashdesk'; + $payment['cashdesk'] = $row->getCashdesk()->getId(); + } elseif ($row->getSalary()) { + $payment['type'] = 'salary'; + $payment['salary'] = $row->getSalary()->getId(); + } + } + + $payments[] = $payment; + } + } + + foreach ($doc->getHesabdariRows() as $row) { + if ($row->getPerson()) { + $person = $row->getPerson(); + } elseif ($row->getRef() && $row->getRef()->getCode() == '104') { + $discountAll = $row->getBd(); + } elseif ($row->getRef() && $row->getRef()->getCode() == '61') { + $transferCost = $row->getBs(); + } elseif ($row->getCommodity()) { + $basePrice = $row->getBs(); + $itemDiscount = $row->getDiscount() ?? 0; + $itemDiscountType = $row->getDiscountType() ?? 'fixed'; + $itemDiscountPercent = $row->getDiscountPercent() ?? 0; + $itemTax = $row->getTax() ?? 0; + + if ($itemDiscountType === 'percent' && $itemDiscountPercent > 0) { + $originalPrice = $basePrice / (1 - ($itemDiscountPercent / 100)); + $itemDiscount = round(($originalPrice * $itemDiscountPercent) / 100); + } else { + $originalPrice = $basePrice + $itemDiscount; + } + + $unitPrice = $row->getCommdityCount() > 0 ? $originalPrice / $row->getCommdityCount() : 0; + + $netPrice = $basePrice; + $totalInvoice += $netPrice; + + $items[] = [ + 'name' => [ + 'id' => $row->getCommodity()->getId(), + 'name' => $row->getCommodity()->getName(), + 'code' => $row->getCommodity()->getCode() + ], + 'count' => $row->getCommdityCount(), + 'price' => $unitPrice, + 'discountPercent' => $itemDiscountPercent, + 'discountAmount' => $itemDiscount, + 'total' => $netPrice, + 'description' => $row->getDes(), + 'showPercentDiscount' => $itemDiscountType === 'percent', + 'tax' => $itemTax + ]; + } + } + + $totalDiscount = 0; + if ($discountType === 'percent') { + $totalDiscount = round(($totalInvoice * $discountPercent) / 100); + } else { + $totalDiscount = $discountAll; + } + + $finalTotal = $totalInvoice - $totalDiscount + $transferCost; + $totalTax = 0; + foreach ($items as $item) { + $totalTax += $item['tax']; + } + $finalTotal += $totalTax; + + return [ + 'result' => 1, + 'data' => [ + 'id' => $doc->getCode(), + 'date' => $doc->getDate(), + 'person' => $person ? [ + 'id' => $person->getId(), + 'name' => $person->getNikename(), + 'code' => $person->getCode() + ] : null, + 'des' => $doc->getDes(), + 'totalInvoice' => $totalInvoice, + 'taxPercent' => $taxPercent, + 'discountType' => $discountType, + 'discountPercent' => $discountPercent, + 'totalDiscount' => $totalDiscount, + 'shippingCost' => $transferCost, + 'showTotalPercentDiscount' => $discountType === 'percent', + 'items' => $items, + 'finalTotal' => $finalTotal, + 'payments' => $payments + ] + ]; + + } catch (\Exception $e) { + return [ + 'result' => 0, + 'message' => 'خطا در استخراج اطلاعات فاکتور: ' . $e->getMessage(), + 'data' => null + ]; + } + } + private function validateInvoiceForTax($invoice): array + { + try { + if (!$invoice) { + return [ + 'valid' => false, + 'message' => 'فاکتور معتبر نیست' + ]; + } + + $extractedData = $this->extractInvoiceData($invoice); + if ($extractedData['result'] !== 1) { + return [ + 'valid' => false, + 'message' => $extractedData['message'] + ]; + } + + $data = $extractedData['data']; + $errors = []; + + if (empty($data['items'])) { + return [ + 'valid' => false, + 'message' => 'فاکتور فاقد اقلام است' + ]; + } + + $rowNumber = 1; + foreach ($data['items'] as $item) { + $commodity = $item['name']; + + if (empty($commodity['code'])) { + $errors[] = "ردیف {$rowNumber}: کد کالا/خدمت تعریف نشده است"; + } + + $taxCode = null; + if (method_exists($invoice, 'getHesabdariRows')) { + $rows = $invoice->getHesabdariRows(); + foreach ($rows as $row) { + if ($row->getCommodity() && $row->getCommodity()->getId() == $commodity['id']) { + $commodityObj = $row->getCommodity(); + if (method_exists($commodityObj, 'getTaxCode')) { + $taxCode = $commodityObj->getTaxCode(); + } + break; + } + } + } + if (empty($taxCode)) { + $errors[] = "کالا/خدمت {$rowNumber}: کد مالیاتی تعریف نشده است"; + } + + $taxUnit = null; + if (method_exists($invoice, 'getHesabdariRows')) { + $rows = $invoice->getHesabdariRows(); + foreach ($rows as $row) { + if ($row->getCommodity() && $row->getCommodity()->getId() == $commodity['id']) { + $commodityObj = $row->getCommodity(); + if (method_exists($commodityObj, 'getTaxUnit')) { + $taxUnit = $commodityObj->getTaxUnit(); + } + break; + } + } + } + if (empty($taxUnit)) { + $errors[] = "کالا/خدمت {$rowNumber}: واحد مالیاتی تعریف نشده است"; + } + + $rowNumber++; + } + + $totalTax = 0; + foreach ($data['items'] as $item) { + $totalTax += $item['tax']; + } + + if (fmod($totalTax, 1) != 0) { + $errors[] = "مبلغ مالیات بر ارزش افزوده نباید اعشار داشته باشد"; + } + + if ($data['shippingCost'] > 0) { + $errors[] = "هزینه حمل باید صفر باشد"; + } + + if (!empty($errors)) { + return [ + 'valid' => false, + 'message' => implode('، ', $errors) + ]; + } + + return [ + 'valid' => true, + 'message' => 'فاکتور معتبر است' + ]; + + } catch (\Exception $e) { + return [ + 'valid' => false, + 'message' => 'خطا اعتبارسنجی سامانه مالیاتی: ' . $e->getMessage() + ]; + } + } + + #[Route('/api/plugins/tax/invoice/send/{id}', name: 'plugin_tax_invoice_send', methods: ['POST'])] + public function sendTaxInvoice(int $id, Access $access, Log $log, EntityManagerInterface $em, registryMGR $registryMGR): JsonResponse + { + $acc = $access->hasRole('plugTaxSettings'); + if (!$acc) { + throw $this->createAccessDeniedException('شما دسترسی لازم را ندارید.'); + } + + $businessId = is_object($acc['bid']) ? $acc['bid']->getId() : $acc['bid']; + $user = $this->getUser(); + $userId = $user instanceof \App\Entity\User ? $user->getId() : null; + + $taxInvoiceRepo = $em->getRepository(PluginTaxInvoice::class); + $taxInvoice = $taxInvoiceRepo->findOneBy([ + 'id' => $id, + 'business' => $businessId + ]); + + if (!$taxInvoice) { + return $this->json([ + 'success' => false, + 'message' => 'فاکتور مالیاتی مورد نظر یافت نشد' + ]); + } + + $invoiceStatus = $taxInvoice->getStatus(); + + if ($invoiceStatus !== 'pending' && $invoiceStatus !== 'error') { + return $this->json([ + 'success' => false, + 'message' => 'فقط فاکتورهای ارسال نشده یا خطا دار قابل ارسال هستند' + ]); + } + + $repo = $em->getRepository(PluginTaxsettingsKey::class); + $taxSettings = $repo->findOneBy(['business_id' => $businessId, 'user_id' => $userId]); + + if (!$taxSettings || !$taxSettings->getPrivateKey() || !$taxSettings->getTaxMemoryId()) { + return $this->json([ + 'success' => false, + 'message' => 'تنظیمات مالیاتی تکمیل نشده است. لطفاً ابتدا تنظیمات را تکمیل کنید.' + ]); + } + + try { + $username = $taxSettings->getTaxMemoryId(); + $privateKey = $taxSettings->getPrivateKey(); + + if (!$username || !$privateKey) { + return $this->json([ + 'success' => false, + 'message' => 'تنظیمات مالیاتی تکمیل نشده است. لطفاً ابتدا تنظیمات را تکمیل کنید.' + ]); + } + + $moadian = new \SnappMarketPro\Moadian\Moadian( + '', + $privateKey, + '', + $username, + $this->getMoadianBaseUrl($registryMGR) + ); + + $serverInfo = $moadian->getServerInformation(); + if (!isset($serverInfo['result']['data']['publicKeys'][0])) { + return $this->json([ + 'success' => false, + 'message' => 'خطا در دریافت اطلاعات سرور مودیان' + ]); + } + + $taxOrgPublicKey = $serverInfo['result']['data']['publicKeys'][0]['key']; + $taxOrgKeyId = $serverInfo['result']['data']['publicKeys'][0]['id']; + + $moadian = new \SnappMarketPro\Moadian\Moadian( + $taxOrgPublicKey, + $privateKey, + $taxOrgKeyId, + $username, + $this->getMoadianBaseUrl($registryMGR) + ); + + $token = $moadian->login(); + + if (!$token) { + return $this->json([ + 'success' => false, + 'message' => 'خطا در اتصال به سامانه مودیان، لطفاً تنظیمات را بررسی کنید.' + ]); + } + + $moadian->setToken($token); + + $invoice = $taxInvoice->getInvoice(); + + try { + if (!$invoice) { + throw new \Exception('فاکتور معتبر نیست'); + } + + $validationResult = $this->validateInvoiceForTax($invoice); + if (!$validationResult['valid']) { + throw new \Exception($validationResult['message']); + } + + $invoiceDto = $this->buildInvoiceDto($invoice, $moadian, $taxSettings->getEconomicCode()); + if (!$invoiceDto) { + throw new \Exception('خطا در آماده‌سازی فاکتور: خطا در ساخت DTO فاکتور'); + } + + $response = $moadian->sendInvoices([$invoiceDto]); + } catch (\Exception $e) { + return $this->json([ + 'success' => false, + 'message' => $e->getMessage(), + 'trace' => $e->getTraceAsString() + ]); + } + + if (isset($response['result'][0]['referenceNumber']) && !empty($response['result'])) { + $taxInvoice->setStatus('sent'); + $taxInvoice->setTaxSystemInvoiceNumber($response['result'][0]['referenceNumber']); + $taxInvoice->setSentAt(new \DateTimeImmutable()); + $em->persist($taxInvoice); + $em->flush(); + + $log->insert( + 'ارسال فاکتور مالیاتی', + 'فاکتور مالیاتی شماره ' . $taxInvoice->getInvoiceCode() . ' به سامانه مودیان ارسال شد.', + $this->getUser(), + $businessId + ); + + if ($invoiceStatus === 'error') { + $taxInvoice->setInvoiceType('اصلاحی'); + $em->persist($taxInvoice); + $em->flush(); + } + + return $this->json([ + 'success' => true, + 'data' => $response, + 'invoiceCode' => $taxInvoice->getInvoiceCode(), + 'referenceNumber' => $response['result'][0]['referenceNumber'] ?? null + ]); + } else { + return $this->json([ + 'success' => false, + 'message' => 'خطا در ارسال فاکتور: ' . $response['result'][0]['error'], + 'response' => $response + ]); + } + } catch (\Exception $e) { + return $this->json([ + 'success' => false, + 'message' => 'خطا در ارسال فاکتور', + 'trace' => $e->getTraceAsString() + ]); + } + } + + #[Route('/api/plugins/tax/invoice/delete/{id}', name: 'plugin_tax_invoice_delete', methods: ['DELETE'])] + public function deleteTaxInvoice(int $id, Access $access, Log $log, EntityManagerInterface $em): JsonResponse + { + $acc = $access->hasRole('plugTaxSettings'); + if (!$acc) { + throw $this->createAccessDeniedException('شما دسترسی لازم را ندارید.'); + } + + $businessId = is_object($acc['bid']) ? $acc['bid']->getId() : $acc['bid']; + + try { + $taxInvoiceRepo = $em->getRepository(PluginTaxInvoice::class); + $taxInvoice = $taxInvoiceRepo->findOneBy([ + 'id' => $id, + 'business' => $businessId + ]); + + if (!$taxInvoice) { + return $this->json([ + 'success' => false, + 'message' => 'فاکتور مالیاتی مورد نظر یافت نشد' + ]); + } + + if ($taxInvoice->getStatus() !== 'pending' && $taxInvoice->getStatus() !== 'error') { + return $this->json([ + 'success' => false, + 'message' => 'فقط فاکتورهای ارسال نشده یا خطا دار قابل حذف هستند' + ]); + } + + $invoiceCode = $taxInvoice->getInvoiceCode(); + + $em->remove($taxInvoice); + $em->flush(); + + $log->insert( + 'فاکتور مالیاتی', + 'فاکتور مالیاتی شماره ' . $invoiceCode . ' حذف شد.', + $this->getUser(), + $businessId + ); + + return $this->json([ + 'success' => true, + 'message' => 'فاکتور مالیاتی با موفقیت حذف شد' + ]); + + } catch (\Exception $e) { + return $this->json([ + 'success' => false, + 'message' => 'خطا در حذف فاکتور مالیاتی: ' . $e->getMessage() + ]); + } + } + + #[Route('/api/plugins/tax/inquire-status', name: 'plugin_tax_inquire_status', methods: ['POST'])] + public function inquireInvoiceStatus(Request $request, Access $access, EntityManagerInterface $em, registryMGR $registryMGR): JsonResponse + { + $acc = $access->hasRole('plugTaxSettings'); + if (!$acc) { + throw $this->createAccessDeniedException('شما دسترسی لازم را ندارید.'); + } + + $params = $request->getPayload()->all(); + $referenceNumbers = $params['referenceNumbers'] ?? []; + + if (empty($referenceNumbers)) { + return $this->json([ + 'success' => false, + 'message' => 'شماره‌های ارجاع الزامی است' + ]); + } + + $businessId = is_object($acc['bid']) ? $acc['bid']->getId() : $acc['bid']; + $user = $this->getUser(); + $userId = $user instanceof \App\Entity\User ? $user->getId() : null; + + $repo = $em->getRepository(PluginTaxsettingsKey::class); + $taxSettings = $repo->findOneBy(['business_id' => $businessId, 'user_id' => $userId]); + + if (!$taxSettings || !$taxSettings->getPrivateKey() || !$taxSettings->getTaxMemoryId()) { + return $this->json([ + 'success' => false, + 'message' => 'تنظیمات مالیاتی تکمیل نشده است. لطفاً ابتدا تنظیمات را تکمیل کنید.' + ]); + } + + try { + $username = $taxSettings->getTaxMemoryId(); + $privateKey = $taxSettings->getPrivateKey(); + $taxOrgPublicKey = ''; + $taxOrgKeyId = ''; + + $moadian = new \SnappMarketPro\Moadian\Moadian( + $taxOrgPublicKey, + $privateKey, + $taxOrgKeyId, + $username, + $this->getMoadianBaseUrl($registryMGR) + ); + + $token = $moadian->login(); + $moadian->setToken($token); + + $response = $moadian->inquireByReferenceNumbers($referenceNumbers); + + if (isset($response['result']['data']) && is_array($response['result']['data'])) { + foreach ($response['result']['data'] as $invoiceData) { + $referenceNumber = $invoiceData['referenceNumber'] ?? null; + $status = $invoiceData['status'] ?? null; + $errors = $invoiceData['data']['error'] ?? []; + $warnings = $invoiceData['data']['warning'] ?? []; + + if ($referenceNumber) { + $taxInvoiceRepo = $em->getRepository(PluginTaxInvoice::class); + $taxInvoice = $taxInvoiceRepo->findOneBy([ + 'taxSystemInvoiceNumber' => $referenceNumber, + 'business' => $businessId + ]); + + if ($taxInvoice) { + if ($status === 'FAILED') { + $taxInvoice->setStatus('error'); + + $errorData = [ + 'errors' => $errors, + 'warnings' => $warnings, + 'status' => $status, + 'timestamp' => time() + ]; + $taxInvoice->setErrorMessage(json_encode($errorData, JSON_UNESCAPED_UNICODE)); + } elseif ($status === 'SUCCESS') { + $taxInvoice->setStatus('accepted'); + $taxInvoice->setErrorMessage(null); + } + + $em->persist($taxInvoice); + } + } + } + $em->flush(); + } + + return $this->json([ + 'success' => true, + 'data' => $response['result']['data'] ?? [] + ]); + + } catch (\Exception $e) { + return $this->json([ + 'success' => false, + 'message' => 'خطا در دریافت وضعیت فاکتور: ' . $e->getMessage() + ]); + } + } + + private function getCommodityTaxCodeFromInvoice($invoice, $commodityId): string + { + try { + $rows = $invoice->getHesabdariRows(); + foreach ($rows as $row) { + if ($row->getCommodity() && $row->getCommodity()->getId() == $commodityId) { + $commodity = $row->getCommodity(); + if (method_exists($commodity, 'getTaxCode') && $commodity->getTaxCode()) { + return $commodity->getTaxCode(); + } + if (method_exists($commodity, 'getCode') && $commodity->getCode()) { + return $commodity->getCode(); + } + break; + } + } + return '2720000166053'; + } catch (\Exception $e) { + return '2720000166053'; + } + } + + private function getCommodityUnitFromInvoice($invoice, $commodityId): string + { + try { + $rows = $invoice->getHesabdariRows(); + foreach ($rows as $row) { + if ($row->getCommodity() && $row->getCommodity()->getId() == $commodityId) { + $commodity = $row->getCommodity(); + if (method_exists($commodity, 'getTaxUnit') && $commodity->getTaxUnit()) { + return $commodity->getTaxUnit(); + } + break; + } + } + return '1627'; + } catch (\Exception $e) { + return '1627'; + } + } + + private function calculateVra($itemTotal, $itemTax, $invoice): int + { + try { + if ($itemTotal <= 0) { + return 0; + } + + if ($itemTax <= 0) { + return 0; + } + + $vra = round(($itemTax / $itemTotal) * 100, 2); + + $invoiceType = $invoice->getType() ?? 'sell'; + + switch ($invoiceType) { + case 'return_sell': + case 'return_buy': + case 'correction': + case 'cancel': + return 0; + case 'export': + return 0; + default: + break; + } + + $taxPercent = $invoice->getTaxPercent() ?? 9; + $expectedVra = (int) $taxPercent; + + if ($vra > 0 && abs($vra - $expectedVra) <= 1) { + return $expectedVra; + } + + return (int) $vra; + } catch (\Exception $e) { + return 9; + } + } + + private function buildInvoiceDto($invoice, $moadian, $moadianTaxId): ?\SnappMarketPro\Moadian\Dto\InvoiceDto + { + try { + if (!$moadian || !$moadianTaxId) { + throw new \Exception('کلاس Moadian معتبر نیست یا شماره اقتصادی معتبر نیست'); + } + + $extractedData = $this->extractInvoiceData($invoice); + if ($extractedData['result'] !== 1) { + throw new \Exception($extractedData['message']); + } + + $data = $extractedData['data']; + $taxId = $moadianTaxId; + $internalId = $invoice->getId() ?? 1; + + if (!method_exists($moadian, 'generateTaxId') || !method_exists($moadian, 'normalizeInvoiceNumber')) { + throw new \Exception('متدهای مورد نیاز در کلاس Moadian وجود ندارد'); + } + + $totalTax = 0; + foreach ($data['items'] as $item) { + $totalTax += $item['tax']; + } + + $dateTime = new DateTime(); + $header = (new \SnappMarketPro\Moadian\Dto\InvoiceHeaderDto()) + ->setTaxid($moadian->generateTaxId($dateTime, $internalId)) + ->setIndati2m($dateTime->getTimestamp() * 1000) + ->setIndatim($dateTime->getTimestamp() * 1000) + ->setInty(2) + ->setInno($moadian->normalizeInvoiceNumber($internalId)) + ->setIrtaxid(null) + ->setInp(1) + ->setIns(1) + ->setTins($taxId) + ->setTob(1) + ->setBid(null) + ->setTinb(null) + ->setSbc(null) + ->setBpc(null) + ->setBbc(null) + ->setFt(null) + ->setBpn(null) + ->setScln(null) + ->setScc(null) + ->setCrn(null) + ->setBillid(null) + ->setTprdis($data['totalInvoice']) + ->setTdis($data['totalDiscount']) + ->setTadis($data['totalInvoice'] - $data['totalDiscount']) + ->setTvam($totalTax) + ->setTodam($data['shippingCost']) + ->setTbill($data['finalTotal']) + ->setSetm(null) + ->setCap(null) + ->setInsp(null) + ->setTvop(null) + ->setTax17(0); + $bodyItems = []; + + foreach ($data['items'] as $item) { + $itemTax = $item['tax']; + $itemTotal = $item['total'] + $itemTax; + + $vra = $this->calculateVra($item['total'], $itemTax, $invoice); + + $bodyDto = (new \SnappMarketPro\Moadian\Dto\InvoiceBodyDto()) + ->setSstid($this->getCommodityTaxCodeFromInvoice($invoice, $item['name']['id'])) + ->setSstt($item['name']['name']) + ->setAm($item['count']) + ->setMu($this->getCommodityUnitFromInvoice($invoice, $item['name']['id'])) + ->setFee($item['price']) + ->setCfee(null) + ->setCut(null) + ->setExr(null) + ->setPrdis($item['total']) + ->setDis($item['discountAmount']) + ->setAdis($item['total'] - $item['discountAmount']) + ->setVra($vra) + ->setVam($itemTax) + ->setOdt(null) + ->setOdr(null) + ->setOdam(null) + ->setOlt(null) + ->setOlr(null) + ->setOlam(null) + ->setConsfee(null) + ->setSpro(null) + ->setBros(null) + ->setTcpbs(null) + ->setCop(null) + ->setVop(null) + ->setBsrn(null) + ->setTsstam($itemTotal); + + $bodyItems[] = $bodyDto; + } + + $paymentDto = (new \SnappMarketPro\Moadian\Dto\InvoicePaymentDto()) + ->setIinn(null) + ->setAcn(null) + ->setTrmn(null) + ->setTrn(null) + ->setPcn(null) + ->setPid(null) + ->setPdt(null); + + $invoiceDto = new \SnappMarketPro\Moadian\Dto\InvoiceDto(); + $invoiceDto->setHeader($header); + $invoiceDto->setBody($bodyItems); + $invoiceDto->setPayments([$paymentDto]); + + return $invoiceDto; + } catch (\Exception $e) { + return null; + } + } + + #[Route('/api/plugins/tax/invoice/send-bulk', name: 'plugin_tax_invoice_send_bulk', methods: ['POST'])] + public function sendBulkTaxInvoices(Request $request, Access $access, Log $log, EntityManagerInterface $em, registryMGR $registryMGR): JsonResponse + { + $acc = $access->hasRole('plugTaxSettings'); + if (!$acc) { + throw $this->createAccessDeniedException('شما دسترسی لازم را ندارید.'); + } + + $params = $request->getPayload()->all(); + $invoiceIds = $params['ids'] ?? []; + + if (empty($invoiceIds)) { + return $this->json([ + 'success' => false, + 'message' => 'شناسه فاکتورهای مالیاتی الزامی است' + ]); + } + + $businessId = is_object($acc['bid']) ? $acc['bid']->getId() : $acc['bid']; + $user = $this->getUser(); + $userId = $user instanceof \App\Entity\User ? $user->getId() : null; + + $repo = $em->getRepository(PluginTaxsettingsKey::class); + $taxSettings = $repo->findOneBy(['business_id' => $businessId, 'user_id' => $userId]); + + if (!$taxSettings || !$taxSettings->getPrivateKey() || !$taxSettings->getTaxMemoryId()) { + return $this->json([ + 'success' => false, + 'message' => 'تنظیمات مالیاتی تکمیل نشده است. لطفاً ابتدا تنظیمات را تکمیل کنید.' + ]); + } + + try { + $username = $taxSettings->getTaxMemoryId(); + $privateKey = $taxSettings->getPrivateKey(); + + if (!$username || !$privateKey) { + return $this->json([ + 'success' => false, + 'message' => 'تنظیمات مالیاتی تکمیل نشده است. لطفاً ابتدا تنظیمات را تکمیل کنید.' + ]); + } + + $moadian = new \SnappMarketPro\Moadian\Moadian( + '', + $privateKey, + '', + $username, + $this->getMoadianBaseUrl($registryMGR) + ); + + $serverInfo = $moadian->getServerInformation(); + if (!isset($serverInfo['result']['data']['publicKeys'][0])) { + return $this->json([ + 'success' => false, + 'message' => 'خطا در دریافت اطلاعات سرور مودیان' + ]); + } + + $taxOrgPublicKey = $serverInfo['result']['data']['publicKeys'][0]['key']; + $taxOrgKeyId = $serverInfo['result']['data']['publicKeys'][0]['id']; + + $moadian = new \SnappMarketPro\Moadian\Moadian( + $taxOrgPublicKey, + $privateKey, + $taxOrgKeyId, + $username, + $this->getMoadianBaseUrl($registryMGR) + ); + + $token = $moadian->login(); + + if (!$token) { + return $this->json([ + 'success' => false, + 'message' => 'خطا در اتصال به سامانه مودیان، لطفاً تنظیمات را بررسی کنید.' + ]); + } + + $moadian->setToken($token); + + $taxInvoiceRepo = $em->getRepository(PluginTaxInvoice::class); + $results = []; + $successCount = 0; + $errorCount = 0; + $processedCodes = []; + + foreach ($invoiceIds as $id) { + try { + $taxInvoice = $taxInvoiceRepo->findOneBy([ + 'id' => $id, + 'business' => $businessId + ]); + + if (!$taxInvoice) { + $results[] = [ + 'id' => $id, + 'code' => null, + 'success' => false, + 'message' => 'فاکتور مالیاتی مورد نظر یافت نشد' + ]; + $errorCount++; + continue; + } + + $invoiceStatus = $taxInvoice->getStatus(); + + if ($invoiceStatus !== 'pending' && $invoiceStatus !== 'error') { + $results[] = [ + 'id' => $id, + 'code' => $taxInvoice->getInvoiceCode(), + 'success' => false, + 'message' => 'فقط فاکتورهای ارسال نشده یا خطا دار قابل ارسال هستند' + ]; + $errorCount++; + continue; + } + + $invoice = $taxInvoice->getInvoice(); + + if (!$invoice) { + $results[] = [ + 'id' => $id, + 'code' => $taxInvoice->getInvoiceCode(), + 'success' => false, + 'message' => 'فاکتور معتبر نیست' + ]; + $errorCount++; + continue; + } + + $validationResult = $this->validateInvoiceForTax($invoice); + if (!$validationResult['valid']) { + $results[] = [ + 'id' => $id, + 'code' => $taxInvoice->getInvoiceCode(), + 'success' => false, + 'message' => $validationResult['message'] + ]; + $errorCount++; + continue; + } + + $invoiceDto = $this->buildInvoiceDto($invoice, $moadian, $taxSettings->getEconomicCode()); + if (!$invoiceDto) { + $results[] = [ + 'id' => $id, + 'code' => $taxInvoice->getInvoiceCode(), + 'success' => false, + 'message' => 'خطا در آماده‌سازی فاکتور: خطا در ساخت DTO فاکتور' + ]; + $errorCount++; + continue; + } + + $response = $moadian->sendInvoices([$invoiceDto]); + + if (isset($response['result'][0]['referenceNumber']) && !empty($response['result'])) { + $taxInvoice->setStatus('sent'); + $taxInvoice->setTaxSystemInvoiceNumber($response['result'][0]['referenceNumber']); + $taxInvoice->setSentAt(new \DateTimeImmutable()); + $em->persist($taxInvoice); + $em->flush(); + + if ($invoiceStatus === 'error') { + $taxInvoice->setInvoiceType('اصلاحی'); + $em->persist($taxInvoice); + $em->flush(); + } + + $results[] = [ + 'id' => $id, + 'code' => $taxInvoice->getInvoiceCode(), + 'success' => true, + 'message' => 'فاکتور با موفقیت ارسال شد', + 'referenceNumber' => $response['result'][0]['referenceNumber'] ?? null + ]; + $successCount++; + $processedCodes[] = $taxInvoice->getInvoiceCode(); + } else { + $results[] = [ + 'id' => $id, + 'code' => $taxInvoice->getInvoiceCode(), + 'success' => false, + 'message' => 'خطا در ارسال فاکتور: ' . ($response['result'][0]['error'] ?? 'خطای نامشخص') + ]; + $errorCount++; + } + + } catch (\Exception $e) { + $results[] = [ + 'id' => $id, + 'code' => $taxInvoice->getInvoiceCode() ?? null, + 'success' => false, + 'message' => 'خطا در پردازش فاکتور: ' . $e->getMessage() + ]; + $errorCount++; + } + } + + if (!empty($processedCodes)) { + $codesText = implode(', ', $processedCodes); + $log->insert( + 'ارسال گروهی فاکتورهای مالیاتی', + 'فاکتورهای مالیاتی ' . $codesText . ' به سامانه مودیان ارسال شد.', + $this->getUser(), + $businessId + ); + } + + $totalProcessed = count($invoiceIds); + $message = "پردازش {$totalProcessed} فاکتور مالیاتی تکمیل شد. موفق: {$successCount}, ناموفق: {$errorCount}"; + + return $this->json([ + 'success' => $successCount > 0, + 'message' => $message, + 'summary' => [ + 'total' => $totalProcessed, + 'success' => $successCount, + 'error' => $errorCount + ], + 'results' => $results + ]); + + } catch (\Exception $e) { + return $this->json([ + 'success' => false, + 'message' => 'خطا در ارسال گروهی فاکتورهای مالیاتی: ' . $e->getMessage() + ]); + } + } + + +} + diff --git a/hesabixCore/src/Controller/System/RegistrySettingsController.php b/hesabixCore/src/Controller/System/RegistrySettingsController.php index c8edd40..f8a11b2 100644 --- a/hesabixCore/src/Controller/System/RegistrySettingsController.php +++ b/hesabixCore/src/Controller/System/RegistrySettingsController.php @@ -57,6 +57,7 @@ final class RegistrySettingsController extends AbstractController 'appUrl' => $registryMGR->get('system', 'appUrl'), 'appSlogan' => $registryMGR->get('system', 'appSlogan'), 'verifyMobileViaSms' => filter_var($registryMGR->get('system', 'verifyMobileViaSms'), FILTER_VALIDATE_BOOLEAN), + 'taxSystemSandboxMode' => filter_var($registryMGR->get($rootSystem, 'tax_system_sandbox_mode'), FILTER_VALIDATE_BOOLEAN), // تنظیمات FTP 'ftpEnabled' => filter_var($registryMGR->get($rootSystem, 'ftp_enabled'), FILTER_VALIDATE_BOOLEAN), 'ftpHost' => $registryMGR->get($rootSystem, 'ftp_host') ?: '', @@ -96,6 +97,7 @@ final class RegistrySettingsController extends AbstractController $registryMGR->update('system', 'appUrl', $data['appUrl'] ?? ''); $registryMGR->update('system', 'appSlogan', $data['appSlogan'] ?? ''); $registryMGR->update('system', 'verifyMobileViaSms', $data['verifyMobileViaSms'] ? '1' : '0'); + $registryMGR->update($rootSystem, 'tax_system_sandbox_mode', $data['taxSystemSandboxMode'] ? '1' : '0'); // ذخیره تنظیمات FTP $registryMGR->update($rootSystem, 'ftp_enabled', $data['ftpEnabled'] ? '1' : '0'); $registryMGR->update($rootSystem, 'ftp_host', $data['ftpHost'] ?? ''); diff --git a/hesabixCore/src/Entity/Commodity.php b/hesabixCore/src/Entity/Commodity.php index 2b87f30..b89dcd4 100644 --- a/hesabixCore/src/Entity/Commodity.php +++ b/hesabixCore/src/Entity/Commodity.php @@ -83,6 +83,15 @@ class Commodity #[ORM\Column(type: Types::TEXT, nullable: true)] private ?string $barcodes = null; + #[ORM\Column(length: 255, nullable: true)] + private ?string $taxCode = null; + + #[ORM\Column(length: 255, nullable: true)] + private ?string $taxType = null; + + #[ORM\Column(length: 255, nullable: true)] + private ?string $taxUnit = null; + #[ORM\OneToMany(mappedBy: 'commodity', targetEntity: PriceListDetail::class, orphanRemoval: true)] private Collection $priceListDetails; @@ -421,6 +430,42 @@ class Commodity return $this; } + public function getTaxCode(): ?string + { + return $this->taxCode; + } + + public function setTaxCode(?string $taxCode): static + { + $this->taxCode = $taxCode; + + return $this; + } + + public function getTaxType(): ?string + { + return $this->taxType; + } + + public function setTaxType(?string $taxType): static + { + $this->taxType = $taxType; + + return $this; + } + + public function getTaxUnit(): ?string + { + return $this->taxUnit; + } + + public function setTaxUnit(?string $taxUnit): static + { + $this->taxUnit = $taxUnit; + + return $this; + } + /** * @return Collection */ diff --git a/hesabixCore/src/Entity/PluginTaxInvoice.php b/hesabixCore/src/Entity/PluginTaxInvoice.php new file mode 100644 index 0000000..7aa500f --- /dev/null +++ b/hesabixCore/src/Entity/PluginTaxInvoice.php @@ -0,0 +1,253 @@ +createdAt = new \DateTimeImmutable(); + } + + public function getId(): ?int + { + return $this->id; + } + + public function getBusiness(): ?Business + { + return $this->business; + } + + public function setBusiness(?Business $business): static + { + $this->business = $business; + return $this; + } + + public function getUser(): ?User + { + return $this->user; + } + + public function setUser(?User $user): static + { + $this->user = $user; + return $this; + } + + public function getInvoice(): ?HesabdariDoc + { + return $this->invoice; + } + + public function setInvoice(?HesabdariDoc $invoice): static + { + $this->invoice = $invoice; + return $this; + } + + public function getInvoiceCode(): ?string + { + return $this->invoiceCode; + } + + public function setInvoiceCode(string $invoiceCode): static + { + $this->invoiceCode = $invoiceCode; + return $this; + } + + public function getTaxSystemInvoiceNumber(): ?string + { + return $this->taxSystemInvoiceNumber; + } + + public function setTaxSystemInvoiceNumber(?string $taxSystemInvoiceNumber): static + { + $this->taxSystemInvoiceNumber = $taxSystemInvoiceNumber; + return $this; + } + + public function getTaxSystemReferenceNumber(): ?string + { + return $this->taxSystemReferenceNumber; + } + + public function setTaxSystemReferenceNumber(?string $taxSystemReferenceNumber): static + { + $this->taxSystemReferenceNumber = $taxSystemReferenceNumber; + return $this; + } + + public function getStatus(): ?string + { + return $this->status; + } + + public function setStatus(string $status): static + { + $this->status = $status; + return $this; + } + + public function getResponseData(): ?string + { + return $this->responseData; + } + + public function setResponseData(?string $responseData): static + { + $this->responseData = $responseData; + return $this; + } + + public function getErrorMessage(): ?string + { + return $this->errorMessage; + } + + public function setErrorMessage(?string $errorMessage): static + { + $this->errorMessage = $errorMessage; + return $this; + } + + public function getCreatedAt(): ?\DateTimeImmutable + { + return $this->createdAt; + } + + public function setCreatedAt(\DateTimeImmutable $createdAt): static + { + $this->createdAt = $createdAt; + return $this; + } + + public function getSentAt(): ?\DateTimeImmutable + { + return $this->sentAt; + } + + public function setSentAt(?\DateTimeImmutable $sentAt): static + { + $this->sentAt = $sentAt; + return $this; + } + + public function getConfirmedAt(): ?\DateTimeImmutable + { + return $this->confirmedAt; + } + + public function setConfirmedAt(?\DateTimeImmutable $confirmedAt): static + { + $this->confirmedAt = $confirmedAt; + return $this; + } + + public function getAmount(): ?string + { + return $this->amount; + } + + public function setAmount(string $amount): static + { + $this->amount = $amount; + return $this; + } + + public function getCustomerName(): ?string + { + return $this->customerName; + } + + public function setCustomerName(?string $customerName): static + { + $this->customerName = $customerName; + return $this; + } + + public function getCustomerId(): ?string + { + return $this->customerId; + } + + public function setCustomerId(?string $customerId): static + { + $this->customerId = $customerId; + return $this; + } + + public function getInvoiceType(): ?string + { + return $this->invoiceType; + } + + public function setInvoiceType(?string $invoiceType): static + { + $this->invoiceType = $invoiceType; + return $this; + } +} \ No newline at end of file diff --git a/hesabixCore/src/Entity/PluginTaxsettingsKey.php b/hesabixCore/src/Entity/PluginTaxsettingsKey.php index 5a2e67c..3ee1737 100644 --- a/hesabixCore/src/Entity/PluginTaxsettingsKey.php +++ b/hesabixCore/src/Entity/PluginTaxsettingsKey.php @@ -5,7 +5,7 @@ namespace App\Entity; use Doctrine\ORM\Mapping as ORM; #[ORM\Entity] -#[ORM\Table(name: "plugin_taxsettings_keys")] +#[ORM\Table(name: "plugin_tax_settings")] class PluginTaxsettingsKey { #[ORM\Id] @@ -22,6 +22,9 @@ class PluginTaxsettingsKey #[ORM\Column(type: "text", nullable: true)] private $private_key; + #[ORM\Column(type: "text", nullable: true)] + private $certificate; + #[ORM\Column(type: "string", length: 64, nullable: true)] private $tax_memory_id; @@ -42,6 +45,8 @@ class PluginTaxsettingsKey public function setUserId($val) { $this->user_id = $val; } public function getPrivateKey() { return $this->private_key; } public function setPrivateKey($val) { $this->private_key = $val; } + public function getCertificate() { return $this->certificate; } + public function setCertificate($val) { $this->certificate = $val; } public function getTaxMemoryId() { return $this->tax_memory_id; } public function setTaxMemoryId($val) { $this->tax_memory_id = $val; } public function getEconomicCode() { return $this->economic_code; } diff --git a/hesabixCore/src/Repository/PluginTaxInvoiceRepository.php b/hesabixCore/src/Repository/PluginTaxInvoiceRepository.php new file mode 100644 index 0000000..06f5f94 --- /dev/null +++ b/hesabixCore/src/Repository/PluginTaxInvoiceRepository.php @@ -0,0 +1,106 @@ + + * + * @method PluginTaxInvoice|null find($id, $lockMode = null, $lockVersion = null) + * @method PluginTaxInvoice|null findOneBy(array $criteria, array $orderBy = null) + * @method PluginTaxInvoice findAll() + * @method PluginTaxInvoice findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null) + */ +class PluginTaxInvoiceRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, PluginTaxInvoice::class); + } + + public function save(PluginTaxInvoice $entity, bool $flush = false): void + { + $this->getEntityManager()->persist($entity); + + if ($flush) { + $this->getEntityManager()->flush(); + } + } + + public function remove(PluginTaxInvoice $entity, bool $flush = false): void + { + $this->getEntityManager()->remove($entity); + + if ($flush) { + $this->getEntityManager()->flush(); + } + } + + /** + * پیدا کردن فاکتورهای ارسال شده برای یک کسب‌و‌کار + */ + public function findByBusiness($businessId, $limit = null, $offset = null) + { + $qb = $this->createQueryBuilder('pti') + ->leftJoin('pti.invoice', 'invoice') + ->leftJoin('pti.user', 'user') + ->where('pti.business = :businessId') + ->setParameter('businessId', $businessId) + ->orderBy('pti.createdAt', 'DESC'); + if ($limit) { + $qb->setMaxResults($limit); + } + if ($offset) { + $qb->setFirstResult($offset); + } + + return $qb->getQuery()->getResult(); + } + + /** + * پیدا کردن فاکتور بر اساس کد فاکتور و کسب‌و‌کار + */ + public function findByInvoiceCodeAndBusiness($invoiceCode, $businessId) + { + return $this->createQueryBuilder('pti') + ->where('pti.invoiceCode = :invoiceCode') + ->andWhere('pti.business = :businessId') + ->setParameter('invoiceCode', $invoiceCode) + ->setParameter('businessId', $businessId) + ->getQuery() + ->getOneOrNullResult(); + } + + /** + * آمار فاکتورهای ارسال شده بر اساس وضعیت + */ + public function getStatusStats($businessId) + { + $qb = $this->createQueryBuilder('pti') + ->select('pti.status, COUNT(pti.id) as count') + ->where('pti.business = :businessId') + ->setParameter('businessId', $businessId) + ->groupBy('pti.status'); + + return $qb->getQuery()->getResult(); + } + + /** + * فاکتورهای با وضعیت مشخص + */ + public function findByStatus($businessId, $status) + { + return $this->createQueryBuilder('pti') + ->leftJoin('pti.invoice', 'invoice') + ->where('pti.business = :businessId') + ->andWhere('pti.status = :status') + ->setParameter('businessId', $businessId) + ->setParameter('status', $status) + ->orderBy('pti.createdAt', 'DESC') + ->getQuery() + ->getResult(); + } +} \ No newline at end of file diff --git a/hesabixCore/src/Service/Explore.php b/hesabixCore/src/Service/Explore.php index 79ad1e1..15444be 100644 --- a/hesabixCore/src/Service/Explore.php +++ b/hesabixCore/src/Service/Explore.php @@ -233,6 +233,9 @@ class Explore 'orderPoint' => $item->getOrderPoint(), 'dayLoading' => $item->getDayLoading(), 'minOrderCount' => $item->getMinOrderCount(), + 'taxCode' => $item->getTaxCode(), + 'taxType' => $item->getTaxType(), + 'taxUnit' => $item->getTaxUnit(), 'unitData' => [ 'name' => $item->getUnit()->getName(), 'floatNumber' => $item->getUnit()->getFloatNumber(), diff --git a/hesabixCore/symfony.lock b/hesabixCore/symfony.lock index eca69b1..d2398b5 100644 --- a/hesabixCore/symfony.lock +++ b/hesabixCore/symfony.lock @@ -8,6 +8,15 @@ "ref": "64d8583af5ea57b7afa4aba4b159907f3a148b05" } }, + "doctrine/deprecations": { + "version": "1.1", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "1.0", + "ref": "87424683adc81d7dc305eefec1fced883084aab9" + } + }, "doctrine/doctrine-bundle": { "version": "2.10", "recipe": { diff --git a/webUI/.github/workflows/release.yml b/webUI/.github/workflows/release.yml old mode 100644 new mode 100755 diff --git a/webUI/.gitignore b/webUI/.gitignore old mode 100644 new mode 100755 diff --git a/webUI/LICENSE b/webUI/LICENSE old mode 100644 new mode 100755 diff --git a/webUI/env.d.ts b/webUI/env.d.ts old mode 100644 new mode 100755 diff --git a/webUI/index.html b/webUI/index.html old mode 100644 new mode 100755 diff --git a/webUI/package.json b/webUI/package.json old mode 100644 new mode 100755 diff --git a/webUI/public/.htaccess b/webUI/public/.htaccess old mode 100644 new mode 100755 diff --git a/webUI/public/dashmix/dashmix.app.min.js b/webUI/public/dashmix/dashmix.app.min.js old mode 100644 new mode 100755 diff --git a/webUI/public/dashmix/dashmix.min.css b/webUI/public/dashmix/dashmix.min.css old mode 100644 new mode 100755 diff --git a/webUI/public/favicon.ico b/webUI/public/favicon.ico old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/fontawesome/fa-brands-400.ttf b/webUI/public/fonts/fontawesome/fa-brands-400.ttf old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/fontawesome/fa-brands-400.woff2 b/webUI/public/fonts/fontawesome/fa-brands-400.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/fontawesome/fa-regular-400.ttf b/webUI/public/fonts/fontawesome/fa-regular-400.ttf old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/fontawesome/fa-regular-400.woff2 b/webUI/public/fonts/fontawesome/fa-regular-400.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/fontawesome/fa-solid-900.ttf b/webUI/public/fonts/fontawesome/fa-solid-900.ttf old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/fontawesome/fa-solid-900.woff2 b/webUI/public/fonts/fontawesome/fa-solid-900.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/fontawesome/fa-v4compatibility.ttf b/webUI/public/fonts/fontawesome/fa-v4compatibility.ttf old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/fontawesome/fa-v4compatibility.woff2 b/webUI/public/fonts/fontawesome/fa-v4compatibility.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/inter/inter-v11-latin-300.woff2 b/webUI/public/fonts/inter/inter-v11-latin-300.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/inter/inter-v11-latin-500.woff2 b/webUI/public/fonts/inter/inter-v11-latin-500.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/inter/inter-v11-latin-600.woff2 b/webUI/public/fonts/inter/inter-v11-latin-600.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/inter/inter-v11-latin-700.woff2 b/webUI/public/fonts/inter/inter-v11-latin-700.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/inter/inter-v11-latin-800.woff2 b/webUI/public/fonts/inter/inter-v11-latin-800.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/inter/inter-v11-latin-900.woff2 b/webUI/public/fonts/inter/inter-v11-latin-900.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/inter/inter-v11-latin-regular.woff2 b/webUI/public/fonts/inter/inter-v11-latin-regular.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/sahel/Sahel-Black-FD.eot b/webUI/public/fonts/sahel/Sahel-Black-FD.eot old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/sahel/Sahel-Black-FD.ttf b/webUI/public/fonts/sahel/Sahel-Black-FD.ttf old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/sahel/Sahel-Black-FD.woff b/webUI/public/fonts/sahel/Sahel-Black-FD.woff old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/sahel/Sahel-Black-FD.woff2 b/webUI/public/fonts/sahel/Sahel-Black-FD.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/sahel/Sahel-Bold-FD.eot b/webUI/public/fonts/sahel/Sahel-Bold-FD.eot old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/sahel/Sahel-Bold-FD.ttf b/webUI/public/fonts/sahel/Sahel-Bold-FD.ttf old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/sahel/Sahel-Bold-FD.woff b/webUI/public/fonts/sahel/Sahel-Bold-FD.woff old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/sahel/Sahel-Bold-FD.woff2 b/webUI/public/fonts/sahel/Sahel-Bold-FD.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/sahel/Sahel-FD.eot b/webUI/public/fonts/sahel/Sahel-FD.eot old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/sahel/Sahel-FD.ttf b/webUI/public/fonts/sahel/Sahel-FD.ttf old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/sahel/Sahel-FD.woff b/webUI/public/fonts/sahel/Sahel-FD.woff old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/sahel/Sahel-FD.woff2 b/webUI/public/fonts/sahel/Sahel-FD.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/sahel/Sahel-Light-FD.eot b/webUI/public/fonts/sahel/Sahel-Light-FD.eot old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/sahel/Sahel-Light-FD.ttf b/webUI/public/fonts/sahel/Sahel-Light-FD.ttf old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/sahel/Sahel-Light-FD.woff b/webUI/public/fonts/sahel/Sahel-Light-FD.woff old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/sahel/Sahel-Light-FD.woff2 b/webUI/public/fonts/sahel/Sahel-Light-FD.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/sahel/Sahel-SemiBold-FD.eot b/webUI/public/fonts/sahel/Sahel-SemiBold-FD.eot old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/sahel/Sahel-SemiBold-FD.ttf b/webUI/public/fonts/sahel/Sahel-SemiBold-FD.ttf old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/sahel/Sahel-SemiBold-FD.woff b/webUI/public/fonts/sahel/Sahel-SemiBold-FD.woff old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/sahel/Sahel-SemiBold-FD.woff2 b/webUI/public/fonts/sahel/Sahel-SemiBold-FD.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/sahel/sahel.css b/webUI/public/fonts/sahel/sahel.css old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/shabnam/Shabnam-Bold-FD.eot b/webUI/public/fonts/shabnam/Shabnam-Bold-FD.eot old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/shabnam/Shabnam-Bold-FD.ttf b/webUI/public/fonts/shabnam/Shabnam-Bold-FD.ttf old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/shabnam/Shabnam-Bold-FD.woff b/webUI/public/fonts/shabnam/Shabnam-Bold-FD.woff old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/shabnam/Shabnam-Bold-FD.woff2 b/webUI/public/fonts/shabnam/Shabnam-Bold-FD.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/shabnam/Shabnam-FD.eot b/webUI/public/fonts/shabnam/Shabnam-FD.eot old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/shabnam/Shabnam-FD.ttf b/webUI/public/fonts/shabnam/Shabnam-FD.ttf old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/shabnam/Shabnam-FD.woff b/webUI/public/fonts/shabnam/Shabnam-FD.woff old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/shabnam/Shabnam-FD.woff2 b/webUI/public/fonts/shabnam/Shabnam-FD.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/shabnam/Shabnam-Light-FD.eot b/webUI/public/fonts/shabnam/Shabnam-Light-FD.eot old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/shabnam/Shabnam-Light-FD.ttf b/webUI/public/fonts/shabnam/Shabnam-Light-FD.ttf old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/shabnam/Shabnam-Light-FD.woff b/webUI/public/fonts/shabnam/Shabnam-Light-FD.woff old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/shabnam/Shabnam-Light-FD.woff2 b/webUI/public/fonts/shabnam/Shabnam-Light-FD.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/shabnam/Shabnam-Medium-FD.eot b/webUI/public/fonts/shabnam/Shabnam-Medium-FD.eot old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/shabnam/Shabnam-Medium-FD.ttf b/webUI/public/fonts/shabnam/Shabnam-Medium-FD.ttf old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/shabnam/Shabnam-Medium-FD.woff b/webUI/public/fonts/shabnam/Shabnam-Medium-FD.woff old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/shabnam/Shabnam-Medium-FD.woff2 b/webUI/public/fonts/shabnam/Shabnam-Medium-FD.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/shabnam/Shabnam-Thin-FD.eot b/webUI/public/fonts/shabnam/Shabnam-Thin-FD.eot old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/shabnam/Shabnam-Thin-FD.ttf b/webUI/public/fonts/shabnam/Shabnam-Thin-FD.ttf old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/shabnam/Shabnam-Thin-FD.woff b/webUI/public/fonts/shabnam/Shabnam-Thin-FD.woff old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/shabnam/Shabnam-Thin-FD.woff2 b/webUI/public/fonts/shabnam/Shabnam-Thin-FD.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/shabnam/shabnam.css b/webUI/public/fonts/shabnam/shabnam.css old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/simple-line-icons/Simple-Line-Icons.eot b/webUI/public/fonts/simple-line-icons/Simple-Line-Icons.eot old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/simple-line-icons/Simple-Line-Icons.svg b/webUI/public/fonts/simple-line-icons/Simple-Line-Icons.svg old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/simple-line-icons/Simple-Line-Icons.ttf b/webUI/public/fonts/simple-line-icons/Simple-Line-Icons.ttf old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/simple-line-icons/Simple-Line-Icons.woff b/webUI/public/fonts/simple-line-icons/Simple-Line-Icons.woff old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/simple-line-icons/Simple-Line-Icons.woff2 b/webUI/public/fonts/simple-line-icons/Simple-Line-Icons.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/ttf/Vazirmatn-Black.ttf b/webUI/public/fonts/vazir/ttf/Vazirmatn-Black.ttf old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/ttf/Vazirmatn-Bold.ttf b/webUI/public/fonts/vazir/ttf/Vazirmatn-Bold.ttf old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/ttf/Vazirmatn-ExtraBold.ttf b/webUI/public/fonts/vazir/ttf/Vazirmatn-ExtraBold.ttf old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/ttf/Vazirmatn-ExtraLight.ttf b/webUI/public/fonts/vazir/ttf/Vazirmatn-ExtraLight.ttf old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/ttf/Vazirmatn-Light.ttf b/webUI/public/fonts/vazir/ttf/Vazirmatn-Light.ttf old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/ttf/Vazirmatn-Medium.ttf b/webUI/public/fonts/vazir/ttf/Vazirmatn-Medium.ttf old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/ttf/Vazirmatn-Regular.ttf b/webUI/public/fonts/vazir/ttf/Vazirmatn-Regular.ttf old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/ttf/Vazirmatn-SemiBold.ttf b/webUI/public/fonts/vazir/ttf/Vazirmatn-SemiBold.ttf old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/ttf/Vazirmatn-Thin.ttf b/webUI/public/fonts/vazir/ttf/Vazirmatn-Thin.ttf old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/variable/Vazirmatn[wght].ttf b/webUI/public/fonts/vazir/variable/Vazirmatn[wght].ttf old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/vazir.css b/webUI/public/fonts/vazir/vazir.css old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/webfonts/Vazirmatn-Black.woff2 b/webUI/public/fonts/vazir/webfonts/Vazirmatn-Black.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/webfonts/Vazirmatn-Bold.woff2 b/webUI/public/fonts/vazir/webfonts/Vazirmatn-Bold.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/webfonts/Vazirmatn-ExtraBold.woff2 b/webUI/public/fonts/vazir/webfonts/Vazirmatn-ExtraBold.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/webfonts/Vazirmatn-ExtraLight.woff2 b/webUI/public/fonts/vazir/webfonts/Vazirmatn-ExtraLight.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/webfonts/Vazirmatn-FD-Black.woff2 b/webUI/public/fonts/vazir/webfonts/Vazirmatn-FD-Black.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/webfonts/Vazirmatn-FD-Bold.woff2 b/webUI/public/fonts/vazir/webfonts/Vazirmatn-FD-Bold.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/webfonts/Vazirmatn-FD-ExtraBold.woff2 b/webUI/public/fonts/vazir/webfonts/Vazirmatn-FD-ExtraBold.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/webfonts/Vazirmatn-FD-ExtraLight.woff2 b/webUI/public/fonts/vazir/webfonts/Vazirmatn-FD-ExtraLight.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/webfonts/Vazirmatn-FD-Light.woff2 b/webUI/public/fonts/vazir/webfonts/Vazirmatn-FD-Light.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/webfonts/Vazirmatn-FD-Medium.woff2 b/webUI/public/fonts/vazir/webfonts/Vazirmatn-FD-Medium.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/webfonts/Vazirmatn-FD-Regular.woff2 b/webUI/public/fonts/vazir/webfonts/Vazirmatn-FD-Regular.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/webfonts/Vazirmatn-FD-SemiBold.woff2 b/webUI/public/fonts/vazir/webfonts/Vazirmatn-FD-SemiBold.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/webfonts/Vazirmatn-FD-Thin.woff2 b/webUI/public/fonts/vazir/webfonts/Vazirmatn-FD-Thin.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/webfonts/Vazirmatn-Light.woff2 b/webUI/public/fonts/vazir/webfonts/Vazirmatn-Light.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/webfonts/Vazirmatn-Medium.woff2 b/webUI/public/fonts/vazir/webfonts/Vazirmatn-Medium.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/webfonts/Vazirmatn-Regular.woff2 b/webUI/public/fonts/vazir/webfonts/Vazirmatn-Regular.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/webfonts/Vazirmatn-SemiBold.woff2 b/webUI/public/fonts/vazir/webfonts/Vazirmatn-SemiBold.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/webfonts/Vazirmatn-Thin.woff2 b/webUI/public/fonts/vazir/webfonts/Vazirmatn-Thin.woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/fonts/vazir/webfonts/Vazirmatn[wght].woff2 b/webUI/public/fonts/vazir/webfonts/Vazirmatn[wght].woff2 old mode 100644 new mode 100755 diff --git a/webUI/public/img/404.gif b/webUI/public/img/404.gif old mode 100644 new mode 100755 diff --git a/webUI/public/img/android-chrome-192x192.png b/webUI/public/img/android-chrome-192x192.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/android-chrome-512x512.png b/webUI/public/img/android-chrome-512x512.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/apple-touch-icon.png b/webUI/public/img/apple-touch-icon.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/avatar.jpg b/webUI/public/img/avatar.jpg old mode 100644 new mode 100755 diff --git a/webUI/public/img/avatar.png b/webUI/public/img/avatar.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/avatar.webp b/webUI/public/img/avatar.webp old mode 100644 new mode 100755 diff --git a/webUI/public/img/banner1.jpg b/webUI/public/img/banner1.jpg old mode 100644 new mode 100755 diff --git a/webUI/public/img/bg_side_overlay_header.jpg b/webUI/public/img/bg_side_overlay_header.jpg old mode 100644 new mode 100755 diff --git a/webUI/public/img/cover.jpg b/webUI/public/img/cover.jpg old mode 100644 new mode 100755 diff --git a/webUI/public/img/docs/moadian/1.jpg b/webUI/public/img/docs/moadian/1.jpg new file mode 100644 index 0000000..7cba59b Binary files /dev/null and b/webUI/public/img/docs/moadian/1.jpg differ diff --git a/webUI/public/img/docs/moadian/10.jpg b/webUI/public/img/docs/moadian/10.jpg new file mode 100644 index 0000000..ace2a93 Binary files /dev/null and b/webUI/public/img/docs/moadian/10.jpg differ diff --git a/webUI/public/img/docs/moadian/11.jpg b/webUI/public/img/docs/moadian/11.jpg new file mode 100644 index 0000000..85ea2a6 Binary files /dev/null and b/webUI/public/img/docs/moadian/11.jpg differ diff --git a/webUI/public/img/docs/moadian/16.jpg b/webUI/public/img/docs/moadian/16.jpg new file mode 100644 index 0000000..c234ece Binary files /dev/null and b/webUI/public/img/docs/moadian/16.jpg differ diff --git a/webUI/public/img/docs/moadian/17.jpg b/webUI/public/img/docs/moadian/17.jpg new file mode 100644 index 0000000..22621ba Binary files /dev/null and b/webUI/public/img/docs/moadian/17.jpg differ diff --git a/webUI/public/img/docs/moadian/18.jpg b/webUI/public/img/docs/moadian/18.jpg new file mode 100644 index 0000000..3b0e19f Binary files /dev/null and b/webUI/public/img/docs/moadian/18.jpg differ diff --git a/webUI/public/img/docs/moadian/19.jpg b/webUI/public/img/docs/moadian/19.jpg new file mode 100644 index 0000000..1769195 Binary files /dev/null and b/webUI/public/img/docs/moadian/19.jpg differ diff --git a/webUI/public/img/docs/moadian/2.jpg b/webUI/public/img/docs/moadian/2.jpg new file mode 100644 index 0000000..ef323ff Binary files /dev/null and b/webUI/public/img/docs/moadian/2.jpg differ diff --git a/webUI/public/img/docs/moadian/3.jpg b/webUI/public/img/docs/moadian/3.jpg new file mode 100644 index 0000000..8f6a2ec Binary files /dev/null and b/webUI/public/img/docs/moadian/3.jpg differ diff --git a/webUI/public/img/docs/moadian/4.jpg b/webUI/public/img/docs/moadian/4.jpg new file mode 100644 index 0000000..5829820 Binary files /dev/null and b/webUI/public/img/docs/moadian/4.jpg differ diff --git a/webUI/public/img/docs/moadian/5.jpg b/webUI/public/img/docs/moadian/5.jpg new file mode 100644 index 0000000..f252d23 Binary files /dev/null and b/webUI/public/img/docs/moadian/5.jpg differ diff --git a/webUI/public/img/docs/moadian/6.jpg b/webUI/public/img/docs/moadian/6.jpg new file mode 100644 index 0000000..049932a Binary files /dev/null and b/webUI/public/img/docs/moadian/6.jpg differ diff --git a/webUI/public/img/docs/moadian/7.jpg b/webUI/public/img/docs/moadian/7.jpg new file mode 100644 index 0000000..3ee0190 Binary files /dev/null and b/webUI/public/img/docs/moadian/7.jpg differ diff --git a/webUI/public/img/docs/moadian/8.jpg b/webUI/public/img/docs/moadian/8.jpg new file mode 100644 index 0000000..d6cec0c Binary files /dev/null and b/webUI/public/img/docs/moadian/8.jpg differ diff --git a/webUI/public/img/docs/moadian/9.jpg b/webUI/public/img/docs/moadian/9.jpg new file mode 100644 index 0000000..31178ae Binary files /dev/null and b/webUI/public/img/docs/moadian/9.jpg differ diff --git a/webUI/public/img/enamad-logo.png b/webUI/public/img/enamad-logo.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/favicon-16x16.png b/webUI/public/img/favicon-16x16.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/favicon-32x32.png b/webUI/public/img/favicon-32x32.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/favicon.ico b/webUI/public/img/favicon.ico old mode 100644 new mode 100755 diff --git a/webUI/public/img/favicons/apple-touch-icon-180x180.png b/webUI/public/img/favicons/apple-touch-icon-180x180.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/favicons/favicon-192x192.png b/webUI/public/img/favicons/favicon-192x192.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/favicons/favicon.ico b/webUI/public/img/favicons/favicon.ico old mode 100644 new mode 100755 diff --git a/webUI/public/img/favicons/favicon.png b/webUI/public/img/favicons/favicon.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/favicons/favw.png b/webUI/public/img/favicons/favw.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/favw.png b/webUI/public/img/favw.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/icons/bale-logo.png b/webUI/public/img/icons/bale-logo.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/icons/bank.jpg b/webUI/public/img/icons/bank.jpg old mode 100644 new mode 100755 diff --git a/webUI/public/img/icons/business.png b/webUI/public/img/icons/business.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/icons/cashdesk.jpg b/webUI/public/img/icons/cashdesk.jpg old mode 100644 new mode 100755 diff --git a/webUI/public/img/icons/check.jpg b/webUI/public/img/icons/check.jpg old mode 100644 new mode 100755 diff --git a/webUI/public/img/icons/eitaa.jpeg b/webUI/public/img/icons/eitaa.jpeg old mode 100644 new mode 100755 diff --git a/webUI/public/img/icons/melipayamak.png b/webUI/public/img/icons/melipayamak.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/icons/robika.png b/webUI/public/img/icons/robika.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/icons/salary.jpg b/webUI/public/img/icons/salary.jpg old mode 100644 new mode 100755 diff --git a/webUI/public/img/icons/telegram.png b/webUI/public/img/icons/telegram.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/icons/wallet.png b/webUI/public/img/icons/wallet.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/icons/warehouse.jpg b/webUI/public/img/icons/warehouse.jpg old mode 100644 new mode 100755 diff --git a/webUI/public/img/icons/zarinpal.png b/webUI/public/img/icons/zarinpal.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/logo-blue.png b/webUI/public/img/logo-blue.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/logo/homescreen144.png b/webUI/public/img/logo/homescreen144.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/logo/homescreen168.png b/webUI/public/img/logo/homescreen168.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/logo/homescreen192.png b/webUI/public/img/logo/homescreen192.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/logo/homescreen256.png b/webUI/public/img/logo/homescreen256.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/logo/homescreen48.png b/webUI/public/img/logo/homescreen48.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/logo/homescreen512.png b/webUI/public/img/logo/homescreen512.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/logo/homescreen72.png b/webUI/public/img/logo/homescreen72.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/logo/homescreen96.png b/webUI/public/img/logo/homescreen96.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/logo/logo500.png b/webUI/public/img/logo/logo500.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/payways/pec.ir.png b/webUI/public/img/payways/pec.ir.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/payways/zarinpal-logo-min.png b/webUI/public/img/payways/zarinpal-logo-min.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/plugins/accpro.png b/webUI/public/img/plugins/accpro.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/plugins/accpro/intro.png b/webUI/public/img/plugins/accpro/intro.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/plugins/apartemanma.jpg b/webUI/public/img/plugins/apartemanma.jpg old mode 100644 new mode 100755 diff --git a/webUI/public/img/plugins/apartemanma/drawer.jpg b/webUI/public/img/plugins/apartemanma/drawer.jpg old mode 100644 new mode 100755 diff --git a/webUI/public/img/plugins/apartemanma/intro.jpg b/webUI/public/img/plugins/apartemanma/intro.jpg old mode 100644 new mode 100755 diff --git a/webUI/public/img/plugins/club.webp b/webUI/public/img/plugins/club.webp old mode 100644 new mode 100755 diff --git a/webUI/public/img/plugins/ghesta.png b/webUI/public/img/plugins/ghesta.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/plugins/hmr.jpg b/webUI/public/img/plugins/hmr.jpg old mode 100644 new mode 100755 diff --git a/webUI/public/img/plugins/noghrekoob.jpeg b/webUI/public/img/plugins/noghrekoob.jpeg old mode 100644 new mode 100755 diff --git a/webUI/public/img/plugins/onlinestore.webp b/webUI/public/img/plugins/onlinestore.webp old mode 100644 new mode 100755 diff --git a/webUI/public/img/plugins/onlinestore/intro.webp b/webUI/public/img/plugins/onlinestore/intro.webp old mode 100644 new mode 100755 diff --git a/webUI/public/img/plugins/repservice.jpg b/webUI/public/img/plugins/repservice.jpg old mode 100644 new mode 100755 diff --git a/webUI/public/img/plugins/repservice.png b/webUI/public/img/plugins/repservice.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/plugins/rest.jpg b/webUI/public/img/plugins/rest.jpg old mode 100644 new mode 100755 diff --git a/webUI/public/img/plugins/taxplugin.jpg b/webUI/public/img/plugins/taxplugin.jpg new file mode 100644 index 0000000..8b2765d Binary files /dev/null and b/webUI/public/img/plugins/taxplugin.jpg differ diff --git a/webUI/public/img/sabavision.gif b/webUI/public/img/sabavision.gif old mode 100644 new mode 100755 diff --git a/webUI/public/img/site.webmanifest b/webUI/public/img/site.webmanifest old mode 100644 new mode 100755 diff --git a/webUI/public/img/whatsapp.png b/webUI/public/img/whatsapp.png old mode 100644 new mode 100755 diff --git a/webUI/public/img/wp.jpg b/webUI/public/img/wp.jpg old mode 100644 new mode 100755 diff --git a/webUI/public/img/zarinpal-logo-min.png b/webUI/public/img/zarinpal-logo-min.png old mode 100644 new mode 100755 diff --git a/webUI/public/manifest.json b/webUI/public/manifest.json old mode 100644 new mode 100755 diff --git a/webUI/public/service-worker.js b/webUI/public/service-worker.js old mode 100644 new mode 100755 diff --git a/webUI/public/sounds/beep.mp3 b/webUI/public/sounds/beep.mp3 old mode 100644 new mode 100755 diff --git a/webUI/src/App.vue b/webUI/src/App.vue old mode 100644 new mode 100755 diff --git a/webUI/src/assets/dino.png b/webUI/src/assets/dino.png old mode 100644 new mode 100755 diff --git a/webUI/src/assets/hero.png b/webUI/src/assets/hero.png old mode 100644 new mode 100755 diff --git a/webUI/src/assets/logo.svg b/webUI/src/assets/logo.svg old mode 100644 new mode 100755 diff --git a/webUI/src/assets/peach.png b/webUI/src/assets/peach.png old mode 100644 new mode 100755 diff --git a/webUI/src/assets/site.css b/webUI/src/assets/site.css old mode 100644 new mode 100755 diff --git a/webUI/src/components/ChangePasswordDialog.vue b/webUI/src/components/ChangePasswordDialog.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/Editor.vue b/webUI/src/components/Editor.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/PrintDialog.vue b/webUI/src/components/PrintDialog.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/application/buttons/CalculatorButton.vue b/webUI/src/components/application/buttons/CalculatorButton.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/application/buttons/SecretDialog.vue b/webUI/src/components/application/buttons/SecretDialog.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/application/buttons/ShortcutsButton.vue b/webUI/src/components/application/buttons/ShortcutsButton.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/application/buttons/change_lang.vue b/webUI/src/components/application/buttons/change_lang.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/application/buttons/notifications_btn.vue b/webUI/src/components/application/buttons/notifications_btn.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/application/buttons/profile_btn.vue b/webUI/src/components/application/buttons/profile_btn.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/application/clock.vue b/webUI/src/components/application/clock.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/application/combobox/currency_cob.vue b/webUI/src/components/application/combobox/currency_cob.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/application/combobox/year_cob.vue b/webUI/src/components/application/combobox/year_cob.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/application/list/archive_list.vue b/webUI/src/components/application/list/archive_list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/application/list/sms_list.vue b/webUI/src/components/application/list/sms_list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/forms/Haccountsearch.vue b/webUI/src/components/forms/Haccountsearch.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/forms/Hbankaccountsearch.vue b/webUI/src/components/forms/Hbankaccountsearch.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/forms/Hbankselect.vue b/webUI/src/components/forms/Hbankselect.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/forms/Hcashdesksearch.vue b/webUI/src/components/forms/Hcashdesksearch.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/forms/Hcommoditysearch.vue b/webUI/src/components/forms/Hcommoditysearch.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/forms/Hdatepicker.vue b/webUI/src/components/forms/Hdatepicker.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/forms/Hdocsearch.vue b/webUI/src/components/forms/Hdocsearch.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/forms/HesabdariTreeView.vue b/webUI/src/components/forms/HesabdariTreeView.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/forms/Hnumberinput.vue b/webUI/src/components/forms/Hnumberinput.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/forms/Hpersonsearch.vue b/webUI/src/components/forms/Hpersonsearch.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/forms/Hsalarysearch.vue b/webUI/src/components/forms/Hsalarysearch.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/forms/Htabletreeselect.vue b/webUI/src/components/forms/Htabletreeselect.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/forms/TreeNode.vue b/webUI/src/components/forms/TreeNode.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/widgets/PrintOptions.vue b/webUI/src/components/widgets/PrintOptions.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/widgets/ShareOptions.vue b/webUI/src/components/widgets/ShareOptions.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/widgets/TopCommoditiesChart.vue b/webUI/src/components/widgets/TopCommoditiesChart.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/widgets/TopCostCentersChart.vue b/webUI/src/components/widgets/TopCostCentersChart.vue old mode 100644 new mode 100755 diff --git a/webUI/src/components/widgets/TopIncomeCentersChart.vue b/webUI/src/components/widgets/TopIncomeCentersChart.vue old mode 100644 new mode 100755 diff --git a/webUI/src/css/main.css b/webUI/src/css/main.css old mode 100644 new mode 100755 diff --git a/webUI/src/hesabixConfig.js b/webUI/src/hesabixConfig.js old mode 100644 new mode 100755 diff --git a/webUI/src/i18n/calendarLocalConfig.ts b/webUI/src/i18n/calendarLocalConfig.ts old mode 100644 new mode 100755 diff --git a/webUI/src/i18n/en_lang.ts b/webUI/src/i18n/en_lang.ts old mode 100644 new mode 100755 diff --git a/webUI/src/i18n/fa_lang.ts b/webUI/src/i18n/fa_lang.ts old mode 100644 new mode 100755 index ae654ba..a0c9253 --- a/webUI/src/i18n/fa_lang.ts +++ b/webUI/src/i18n/fa_lang.ts @@ -572,6 +572,9 @@ const fa_lang = { status: "وضعیت", actions: "عملیات" }, + send_to_tax_system: "ارسال به کارپوشه مودیان", + tax_send_success: "فاکتور با موفقیت به سامانه مودیان ارسال شد.", + tax_send_error: "ارسال به سامانه مودیان با خطا مواجه شد.", }, app: { loading: "در حال بارگذاری...", diff --git a/webUI/src/i18n/i18n.ts b/webUI/src/i18n/i18n.ts old mode 100644 new mode 100755 diff --git a/webUI/src/main.ts b/webUI/src/main.ts old mode 100644 new mode 100755 diff --git a/webUI/src/registerServiceWorker.js b/webUI/src/registerServiceWorker.js old mode 100644 new mode 100755 diff --git a/webUI/src/router/index.ts b/webUI/src/router/index.ts old mode 100644 new mode 100755 index 49519b0..f28339d --- a/webUI/src/router/index.ts +++ b/webUI/src/router/index.ts @@ -510,17 +510,29 @@ const router = createRouter({ component: () => import('../views/acc/settings/extramoneys.vue'), }, - { - path: 'plugins/tax/settings', - name: 'business_tax_settings', - component: () => - import('../views/acc/tax/tax-settings.vue'), - }, { path: 'plugins/tax/invoices/list', name: 'tax_invoices_list', component: () => - import('../views/acc/tax/invoices/list.vue'), + import('../views/acc/plugins/tax/invoices/list.vue'), + }, + { + path: 'plugins/tax/settings', + name: 'business_tax_settings', + component: () => + import('../views/acc/plugins/tax/settings.vue'), + }, + { + path: 'plugins/taxsettings/intro', + name: 'taxsettings_intro', + component: () => + import('../views/acc/plugins/taxsettings/intro.vue'), + }, + { + path: 'plugins/taxsettings/doc', + name: 'taxsettings_doc', + component: () => + import('../views/acc/plugins/taxsettings/doc.vue'), }, { path: 'business/logs', diff --git a/webUI/src/scss/_override.scss b/webUI/src/scss/_override.scss old mode 100644 new mode 100755 diff --git a/webUI/src/scss/_variables.scss b/webUI/src/scss/_variables.scss old mode 100644 new mode 100755 diff --git a/webUI/src/scss/components/_VAlert.scss b/webUI/src/scss/components/_VAlert.scss old mode 100644 new mode 100755 diff --git a/webUI/src/scss/components/_VBadge.scss b/webUI/src/scss/components/_VBadge.scss old mode 100644 new mode 100755 diff --git a/webUI/src/scss/components/_VBreadcrumb.scss b/webUI/src/scss/components/_VBreadcrumb.scss old mode 100644 new mode 100755 diff --git a/webUI/src/scss/components/_VButtons.scss b/webUI/src/scss/components/_VButtons.scss old mode 100644 new mode 100755 diff --git a/webUI/src/scss/components/_VCard.scss b/webUI/src/scss/components/_VCard.scss old mode 100644 new mode 100755 diff --git a/webUI/src/scss/components/_VField.scss b/webUI/src/scss/components/_VField.scss old mode 100644 new mode 100755 diff --git a/webUI/src/scss/components/_VInput.scss b/webUI/src/scss/components/_VInput.scss old mode 100644 new mode 100755 diff --git a/webUI/src/scss/components/_VList.scss b/webUI/src/scss/components/_VList.scss old mode 100644 new mode 100755 diff --git a/webUI/src/scss/components/_VNavigationDrawer.scss b/webUI/src/scss/components/_VNavigationDrawer.scss old mode 100644 new mode 100755 diff --git a/webUI/src/scss/components/_VShadow.scss b/webUI/src/scss/components/_VShadow.scss old mode 100644 new mode 100755 diff --git a/webUI/src/scss/components/_VTextField.scss b/webUI/src/scss/components/_VTextField.scss old mode 100644 new mode 100755 diff --git a/webUI/src/scss/components/_VTextarea.scss b/webUI/src/scss/components/_VTextarea.scss old mode 100644 new mode 100755 diff --git a/webUI/src/scss/layout/_container.scss b/webUI/src/scss/layout/_container.scss old mode 100644 new mode 100755 diff --git a/webUI/src/scss/layout/_footer.scss b/webUI/src/scss/layout/_footer.scss old mode 100644 new mode 100755 diff --git a/webUI/src/scss/layout/_horizontal.scss b/webUI/src/scss/layout/_horizontal.scss old mode 100644 new mode 100755 diff --git a/webUI/src/scss/layout/_sidebar.scss b/webUI/src/scss/layout/_sidebar.scss old mode 100644 new mode 100755 diff --git a/webUI/src/scss/layout/_topbar.scss b/webUI/src/scss/layout/_topbar.scss old mode 100644 new mode 100755 diff --git a/webUI/src/scss/style.scss b/webUI/src/scss/style.scss old mode 100644 new mode 100755 diff --git a/webUI/src/stores/applicationStore.ts b/webUI/src/stores/applicationStore.ts old mode 100644 new mode 100755 diff --git a/webUI/src/stores/counter.ts b/webUI/src/stores/counter.ts old mode 100644 new mode 100755 diff --git a/webUI/src/stores/userStore.ts b/webUI/src/stores/userStore.ts old mode 100644 new mode 100755 diff --git a/webUI/src/theme/DarkTheme.ts b/webUI/src/theme/DarkTheme.ts old mode 100644 new mode 100755 diff --git a/webUI/src/theme/LightTheme.ts b/webUI/src/theme/LightTheme.ts old mode 100644 new mode 100755 diff --git a/webUI/src/types/vue3-qrcode-reader.d.ts b/webUI/src/types/vue3-qrcode-reader.d.ts old mode 100644 new mode 100755 diff --git a/webUI/src/utils/date.js b/webUI/src/utils/date.js old mode 100644 new mode 100755 diff --git a/webUI/src/utils/number.js b/webUI/src/utils/number.js old mode 100644 new mode 100755 diff --git a/webUI/src/views/NotFound.vue b/webUI/src/views/NotFound.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/App.vue b/webUI/src/views/acc/App.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/accounting/closeyear.vue b/webUI/src/views/acc/accounting/closeyear.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/accounting/list.vue b/webUI/src/views/acc/accounting/list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/accounting/mod.vue b/webUI/src/views/acc/accounting/mod.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/accounting/openBalance.vue b/webUI/src/views/acc/accounting/openBalance.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/accounting/table.vue b/webUI/src/views/acc/accounting/table.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/accounting/viewDoc.vue b/webUI/src/views/acc/accounting/viewDoc.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/api/list.vue b/webUI/src/views/acc/api/list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/archive/order_new.vue b/webUI/src/views/acc/archive/order_new.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/archive/orders_list.vue b/webUI/src/views/acc/archive/orders_list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/archive/view_files.vue b/webUI/src/views/acc/archive/view_files.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/bank/card.vue b/webUI/src/views/acc/bank/card.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/bank/list.vue b/webUI/src/views/acc/bank/list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/bank/mod.vue b/webUI/src/views/acc/bank/mod.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/buy/list.vue b/webUI/src/views/acc/buy/list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/buy/mod.vue b/webUI/src/views/acc/buy/mod.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/buy/viewInvoice.vue b/webUI/src/views/acc/buy/viewInvoice.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/cashdesk/card.vue b/webUI/src/views/acc/cashdesk/card.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/cashdesk/list.vue b/webUI/src/views/acc/cashdesk/list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/cashdesk/mod.vue b/webUI/src/views/acc/cashdesk/mod.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/cheque/input.vue b/webUI/src/views/acc/cheque/input.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/cheque/list.vue b/webUI/src/views/acc/cheque/list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/cheque/mod.vue b/webUI/src/views/acc/cheque/mod.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/cheque/output.vue b/webUI/src/views/acc/cheque/output.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/cheque/transfer.vue b/webUI/src/views/acc/cheque/transfer.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/commodity/cat/list.vue b/webUI/src/views/acc/commodity/cat/list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/commodity/drop/list.vue b/webUI/src/views/acc/commodity/drop/list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/commodity/drop/mod.vue b/webUI/src/views/acc/commodity/drop/mod.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/commodity/list.vue b/webUI/src/views/acc/commodity/list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/commodity/mod.vue b/webUI/src/views/acc/commodity/mod.vue old mode 100644 new mode 100755 index 19a79af..c8a5b35 --- a/webUI/src/views/acc/commodity/mod.vue +++ b/webUI/src/views/acc/commodity/mod.vue @@ -202,16 +202,27 @@
-
- - +
+ + +
-
@@ -220,7 +231,108 @@
@@ -308,7 +420,7 @@ export default { this.loadData(to.params.id); }, methods: { - generateBarcode(){ + generateBarcode() { for (let index = 0; index < this.barcode.count; index++) { let x = Math.random() * 1000000000000000000; this.data.barcodes = this.data.barcodes + ';' + x diff --git a/webUI/src/views/acc/commodity/priceList/list.vue b/webUI/src/views/acc/commodity/priceList/list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/commodity/priceList/mod.vue b/webUI/src/views/acc/commodity/priceList/mod.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/commodity/priceList/pricelistedit.vue b/webUI/src/views/acc/commodity/priceList/pricelistedit.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/commodity/priceList/view.vue b/webUI/src/views/acc/commodity/priceList/view.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/component/Currency.vue b/webUI/src/views/acc/component/Currency.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/component/Year.vue b/webUI/src/views/acc/component/Year.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/component/archive/archiveUpload.vue b/webUI/src/views/acc/component/archive/archiveUpload.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/component/archive/archive_modal.vue b/webUI/src/views/acc/component/archive/archive_modal.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/component/commodity/changePriceGroup.vue b/webUI/src/views/acc/component/commodity/changePriceGroup.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/component/commodity/quickAddCommodity.vue b/webUI/src/views/acc/component/commodity/quickAddCommodity.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/component/documentLogButton.vue b/webUI/src/views/acc/component/documentLogButton.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/component/helpBtn.vue b/webUI/src/views/acc/component/helpBtn.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/component/hitable.vue b/webUI/src/views/acc/component/hitable.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/component/importModal/commodity-import-excel.vue b/webUI/src/views/acc/component/importModal/commodity-import-excel.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/component/importModal/person-import-excel.vue b/webUI/src/views/acc/component/importModal/person-import-excel.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/component/mostdes.vue b/webUI/src/views/acc/component/mostdes.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/component/notes.vue b/webUI/src/views/acc/component/notes.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/component/notifications/icon.vue b/webUI/src/views/acc/component/notifications/icon.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/component/person.vue b/webUI/src/views/acc/component/person.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/component/person/quickAdd.vue b/webUI/src/views/acc/component/person/quickAdd.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/component/person/quickView.vue b/webUI/src/views/acc/component/person/quickView.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/component/rec.vue b/webUI/src/views/acc/component/rec.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/component/recList.vue b/webUI/src/views/acc/component/recList.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/component/reports/detailsBtn.vue b/webUI/src/views/acc/component/reports/detailsBtn.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/component/send.vue b/webUI/src/views/acc/component/send.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/component/smsPanel.vue b/webUI/src/views/acc/component/smsPanel.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/component/widgets/saleChart.vue b/webUI/src/views/acc/component/widgets/saleChart.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/costs/list.vue b/webUI/src/views/acc/costs/list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/costs/mod.vue b/webUI/src/views/acc/costs/mod.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/dashboard.vue b/webUI/src/views/acc/dashboard.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/incomes/list.vue b/webUI/src/views/acc/incomes/list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/incomes/mod.vue b/webUI/src/views/acc/incomes/mod.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/notifications/notifications.vue b/webUI/src/views/acc/notifications/notifications.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/persons/card.vue b/webUI/src/views/acc/persons/card.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/persons/insert.vue b/webUI/src/views/acc/persons/insert.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/persons/list.vue b/webUI/src/views/acc/persons/list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/persons/receive/list.vue b/webUI/src/views/acc/persons/receive/list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/persons/receive/mod.vue b/webUI/src/views/acc/persons/receive/mod.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/persons/send/list.vue b/webUI/src/views/acc/persons/send/list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/persons/send/mod.vue b/webUI/src/views/acc/persons/send/mod.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/plugins/accpro/intro.vue b/webUI/src/views/acc/plugins/accpro/intro.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/plugins/amartemanma/intro.vue b/webUI/src/views/acc/plugins/amartemanma/intro.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/plugins/cc/intro.vue b/webUI/src/views/acc/plugins/cc/intro.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/plugins/ghesta/intro.vue b/webUI/src/views/acc/plugins/ghesta/intro.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/plugins/ghesta/list.vue b/webUI/src/views/acc/plugins/ghesta/list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/plugins/ghesta/mod.vue b/webUI/src/views/acc/plugins/ghesta/mod.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/plugins/ghesta/view.vue b/webUI/src/views/acc/plugins/ghesta/view.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/plugins/hrm/docs/list.vue b/webUI/src/views/acc/plugins/hrm/docs/list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/plugins/hrm/docs/mod.vue b/webUI/src/views/acc/plugins/hrm/docs/mod.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/plugins/hrm/docs/view.vue b/webUI/src/views/acc/plugins/hrm/docs/view.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/plugins/hrm/intro.vue b/webUI/src/views/acc/plugins/hrm/intro.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/plugins/noghre/employess/list.vue b/webUI/src/views/acc/plugins/noghre/employess/list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/plugins/noghre/employess/mod.vue b/webUI/src/views/acc/plugins/noghre/employess/mod.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/plugins/noghre/intro.vue b/webUI/src/views/acc/plugins/noghre/intro.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/plugins/noghre/order/list.vue b/webUI/src/views/acc/plugins/noghre/order/list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/plugins/noghre/order/mod.vue b/webUI/src/views/acc/plugins/noghre/order/mod.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/plugins/noghre/order/view.vue b/webUI/src/views/acc/plugins/noghre/order/view.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/plugins/noghre/pays.vue b/webUI/src/views/acc/plugins/noghre/pays.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/plugins/onlinestore/dashboard.vue b/webUI/src/views/acc/plugins/onlinestore/dashboard.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/plugins/onlinestore/intro.vue b/webUI/src/views/acc/plugins/onlinestore/intro.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/plugins/repservice/intro.vue b/webUI/src/views/acc/plugins/repservice/intro.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/plugins/repservice/list.vue b/webUI/src/views/acc/plugins/repservice/list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/plugins/repservice/mod.vue b/webUI/src/views/acc/plugins/repservice/mod.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/plugins/repservice/view.vue b/webUI/src/views/acc/plugins/repservice/view.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/plugins/resamap/intro.vue b/webUI/src/views/acc/plugins/resamap/intro.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/plugins/tax/invoices/list.vue b/webUI/src/views/acc/plugins/tax/invoices/list.vue new file mode 100644 index 0000000..bfc08c0 --- /dev/null +++ b/webUI/src/views/acc/plugins/tax/invoices/list.vue @@ -0,0 +1,719 @@ + + + + + \ No newline at end of file diff --git a/webUI/src/views/acc/plugins/tax/settings.vue b/webUI/src/views/acc/plugins/tax/settings.vue new file mode 100755 index 0000000..cb61cf4 --- /dev/null +++ b/webUI/src/views/acc/plugins/tax/settings.vue @@ -0,0 +1,611 @@ + + + + + \ No newline at end of file diff --git a/webUI/src/views/acc/plugins/taxsettings/doc.vue b/webUI/src/views/acc/plugins/taxsettings/doc.vue new file mode 100644 index 0000000..702efcd --- /dev/null +++ b/webUI/src/views/acc/plugins/taxsettings/doc.vue @@ -0,0 +1,747 @@ + + + + + \ No newline at end of file diff --git a/webUI/src/views/acc/plugins/taxsettings/intro.vue b/webUI/src/views/acc/plugins/taxsettings/intro.vue new file mode 100644 index 0000000..758e23d --- /dev/null +++ b/webUI/src/views/acc/plugins/taxsettings/intro.vue @@ -0,0 +1,739 @@ + + + + + \ No newline at end of file diff --git a/webUI/src/views/acc/presell/list.vue b/webUI/src/views/acc/presell/list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/presell/mod.vue b/webUI/src/views/acc/presell/mod.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/presell/view.vue b/webUI/src/views/acc/presell/view.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/presell/viewInvoice.vue b/webUI/src/views/acc/presell/viewInvoice.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/printers/list.vue b/webUI/src/views/acc/printers/list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/printers/printList.vue b/webUI/src/views/acc/printers/printList.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/printers/queue.vue b/webUI/src/views/acc/printers/queue.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/printers/templates.vue b/webUI/src/views/acc/printers/templates.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/reports/balanceSheet.vue b/webUI/src/views/acc/reports/balanceSheet.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/reports/commodity/buysellByCommodity.vue b/webUI/src/views/acc/reports/commodity/buysellByCommodity.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/reports/explore_accounts.vue b/webUI/src/views/acc/reports/explore_accounts.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/reports/persons/buysellByPerson.vue b/webUI/src/views/acc/reports/persons/buysellByPerson.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/reports/persons/debtors.vue b/webUI/src/views/acc/reports/persons/debtors.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/reports/persons/depositors.vue b/webUI/src/views/acc/reports/persons/depositors.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/reports/persons/withdet.vue b/webUI/src/views/acc/reports/persons/withdet.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/reports/reports.vue b/webUI/src/views/acc/reports/reports.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/rfbuy/list.vue b/webUI/src/views/acc/rfbuy/list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/rfbuy/mod.vue b/webUI/src/views/acc/rfbuy/mod.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/rfbuy/viewInvoice.vue b/webUI/src/views/acc/rfbuy/viewInvoice.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/rfsell/list.vue b/webUI/src/views/acc/rfsell/list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/rfsell/mod.vue b/webUI/src/views/acc/rfsell/mod.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/rfsell/viewInvoice.vue b/webUI/src/views/acc/rfsell/viewInvoice.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/router/index.js b/webUI/src/views/acc/router/index.js old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/salary/card.vue b/webUI/src/views/acc/salary/card.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/salary/list.vue b/webUI/src/views/acc/salary/list.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/salary/mod.vue b/webUI/src/views/acc/salary/mod.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/sell/fastMod.vue b/webUI/src/views/acc/sell/fastMod.vue old mode 100644 new mode 100755 diff --git a/webUI/src/views/acc/sell/list.vue b/webUI/src/views/acc/sell/list.vue old mode 100644 new mode 100755 index d615d22..d3e2f0b --- a/webUI/src/views/acc/sell/list.vue +++ b/webUI/src/views/acc/sell/list.vue @@ -19,6 +19,18 @@ + + + + + +