progress in sell and some bug fix for version 0.21.29

This commit is contained in:
Hesabix 2023-10-24 01:00:07 -04:00
parent 7a799be9aa
commit 1d11dbc085
454 changed files with 2219 additions and 10863 deletions

View file

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="PublishConfigData" serverName="hesabix" />
<component name="PublishConfigData" serverName="Local or mounted folder" />
</project>

View file

@ -2,11 +2,8 @@
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/spec" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" packagePrefix="App\" />
<sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" packagePrefix="App\Tests\" />
<sourceFolder url="file://$MODULE_DIR$/hesabixCore/src" isTestSource="false" packagePrefix="App" />
<sourceFolder url="file://$MODULE_DIR$/hesabixCore/var/cache/dev" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/hesabixCore/src" isTestSource="false" packagePrefix="App\" />
<sourceFolder url="file://$MODULE_DIR$/hesabixCore/tests" isTestSource="true" packagePrefix="App\Tests\" />
<excludeFolder url="file://$MODULE_DIR$/var" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/maker-bundle" />
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/inflector" />
@ -45,6 +42,156 @@
<excludeFolder url="file://$MODULE_DIR$/vendor/phpdocumentor/reflection-docblock" />
<excludeFolder url="file://$MODULE_DIR$/vendor/phpdocumentor/reflection-common" />
<excludeFolder url="file://$MODULE_DIR$/vendor/webmozart/assert" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/composer" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/doctrine/annotations" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/doctrine/cache" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/doctrine/collections" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/doctrine/common" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/doctrine/dbal" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/doctrine/deprecations" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/doctrine/doctrine-bundle" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/doctrine/doctrine-migrations-bundle" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/doctrine/event-manager" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/doctrine/inflector" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/doctrine/instantiator" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/doctrine/lexer" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/doctrine/migrations" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/doctrine/orm" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/doctrine/persistence" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/doctrine/sql-formatter" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/dompdf/dompdf" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/egulias/email-validator" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/ezyang/htmlpurifier" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/friendsofsymfony/ckeditor-bundle" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/gregwar/captcha" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/gregwar/captcha-bundle" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/maennchen/zipstream-php" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/markbaker/complex" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/markbaker/matrix" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/masterminds/html5" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/melipayamak/php" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/monolog/monolog" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/mpdf/mpdf" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/mpdf/psr-http-message-shim" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/mpdf/psr-log-aware-trait" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/myclabs/deep-copy" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/nelmio/cors-bundle" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/nikic/php-parser" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/paragonie/random_compat" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/phar-io/manifest" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/phar-io/version" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/phenx/php-font-lib" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/phenx/php-svg-lib" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/phpdocumentor/reflection-common" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/phpdocumentor/reflection-docblock" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/phpdocumentor/type-resolver" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/phpoffice/phpspreadsheet" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/phpstan/phpdoc-parser" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/phpunit/php-code-coverage" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/phpunit/php-file-iterator" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/phpunit/php-invoker" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/phpunit/php-text-template" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/phpunit/php-timer" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/phpunit/phpunit" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/psr/cache" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/psr/container" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/psr/event-dispatcher" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/psr/http-client" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/psr/http-factory" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/psr/http-message" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/psr/link" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/psr/log" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/psr/simple-cache" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/sabberworm/php-css-parser" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/sebastian/cli-parser" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/sebastian/code-unit" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/sebastian/code-unit-reverse-lookup" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/sebastian/comparator" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/sebastian/complexity" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/sebastian/diff" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/sebastian/environment" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/sebastian/exporter" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/sebastian/global-state" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/sebastian/lines-of-code" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/sebastian/object-enumerator" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/sebastian/object-reflector" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/sebastian/recursion-context" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/sebastian/resource-operations" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/sebastian/type" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/sebastian/version" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/setasign/fpdi" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/apache-pack" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/asset" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/browser-kit" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/cache" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/cache-contracts" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/config" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/console" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/css-selector" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/debug-bundle" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/dependency-injection" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/deprecation-contracts" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/doctrine-bridge" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/doctrine-messenger" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/dom-crawler" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/dotenv" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/error-handler" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/event-dispatcher" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/event-dispatcher-contracts" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/expression-language" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/filesystem" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/finder" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/flex" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/form" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/framework-bundle" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/http-client" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/http-client-contracts" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/http-foundation" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/http-kernel" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/mailer" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/maker-bundle" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/messenger" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/mime" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/monolog-bridge" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/monolog-bundle" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/notifier" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/options-resolver" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/password-hasher" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/phpunit-bridge" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/polyfill-intl-grapheme" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/polyfill-intl-icu" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/polyfill-intl-idn" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/polyfill-intl-normalizer" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/polyfill-mbstring" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/process" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/property-access" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/property-info" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/routing" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/runtime" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/security-bundle" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/security-core" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/security-csrf" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/security-http" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/serializer" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/service-contracts" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/stopwatch" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/string" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/translation" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/translation-contracts" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/twig-bridge" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/twig-bundle" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/validator" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/var-dumper" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/var-exporter" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/web-link" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/web-profiler-bundle" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfony/yaml" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/symfonycasts/verify-email-bundle" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/tecnickcom/tcpdf" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/theseer/tokenizer" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/twig/extra-bundle" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/twig/twig" />
<excludeFolder url="file://$MODULE_DIR$/hesabixCore/vendor/webmozart/assert" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />

View file

@ -80,6 +80,156 @@
<path value="$PROJECT_DIR$/vendor/phpdocumentor/reflection-docblock" />
<path value="$PROJECT_DIR$/vendor/phpdocumentor/reflection-common" />
<path value="$PROJECT_DIR$/vendor/webmozart/assert" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/myclabs/deep-copy" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/ezyang/htmlpurifier" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/phpdocumentor/reflection-docblock" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/phpdocumentor/type-resolver" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/phpdocumentor/reflection-common" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/twig/twig" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/twig/extra-bundle" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/phenx/php-svg-lib" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/phenx/php-font-lib" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/tecnickcom/tcpdf" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/gregwar/captcha-bundle" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/gregwar/captcha" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/markbaker/complex" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/markbaker/matrix" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/phar-io/manifest" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/phar-io/version" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/deprecation-contracts" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/dependency-injection" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/security-bundle" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/mime" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/validator" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/browser-kit" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/theseer/tokenizer" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/dom-crawler" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/http-client-contracts" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/css-selector" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/composer" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/property-access" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/monolog-bundle" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/event-dispatcher-contracts" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/paragonie/random_compat" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/polyfill-intl-grapheme" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/yaml" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/polyfill-intl-icu" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/cache" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/doctrine-bridge" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/options-resolver" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/twig-bundle" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/doctrine-messenger" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/runtime" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/http-kernel" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/mailer" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/phpunit-bridge" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/phpoffice/phpspreadsheet" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/security-csrf" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/finder" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/expression-language" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/maker-bundle" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/security-core" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/security-http" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/web-link" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/var-exporter" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/web-profiler-bundle" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/doctrine/cache" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/psr/container" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/string" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/doctrine/event-manager" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/psr/http-message" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/service-contracts" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/doctrine/dbal" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/psr/http-client" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/var-dumper" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/doctrine/annotations" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/psr/http-factory" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/serializer" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/doctrine/orm" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/psr/cache" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/polyfill-intl-idn" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/doctrine/deprecations" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/psr/event-dispatcher" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/doctrine/lexer" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/psr/log" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/debug-bundle" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/doctrine/sql-formatter" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/psr/simple-cache" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/routing" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/doctrine/doctrine-bundle" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/psr/link" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/event-dispatcher" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/doctrine/common" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/error-handler" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/doctrine/migrations" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/flex" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/doctrine/collections" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/notifier" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/doctrine/instantiator" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/cache-contracts" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/doctrine/doctrine-migrations-bundle" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/property-info" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/doctrine/inflector" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/console" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/doctrine/persistence" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/framework-bundle" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/process" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/apache-pack" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/password-hasher" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/polyfill-intl-normalizer" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/filesystem" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/twig-bridge" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/monolog/monolog" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/http-client" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/dotenv" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/form" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/messenger" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/translation" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/polyfill-mbstring" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/dompdf/dompdf" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/monolog-bridge" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/asset" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/http-foundation" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/config" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/translation-contracts" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfony/stopwatch" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/friendsofsymfony/ckeditor-bundle" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/phpstan/phpdoc-parser" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/setasign/fpdi" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/masterminds/html5" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/nelmio/cors-bundle" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/egulias/email-validator" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/melipayamak/php" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/mpdf/mpdf" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/mpdf/psr-http-message-shim" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/mpdf/psr-log-aware-trait" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/symfonycasts/verify-email-bundle" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/maennchen/zipstream-php" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/webmozart/assert" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/sabberworm/php-css-parser" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/sebastian/global-state" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/sebastian/complexity" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/sebastian/recursion-context" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/sebastian/object-enumerator" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/sebastian/object-reflector" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/sebastian/cli-parser" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/phpunit/php-file-iterator" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/sebastian/diff" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/phpunit/php-timer" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/sebastian/lines-of-code" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/phpunit/php-text-template" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/sebastian/type" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/phpunit/php-invoker" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/sebastian/version" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/phpunit/php-code-coverage" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/sebastian/comparator" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/phpunit/phpunit" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/sebastian/exporter" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/sebastian/environment" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/sebastian/code-unit" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/nikic/php-parser" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/sebastian/resource-operations" />
<path value="$PROJECT_DIR$/hesabixCore/vendor/sebastian/code-unit-reverse-lookup" />
</include_path>
</component>
<component name="PhpProjectSharedConfiguration" php_language_level="8.1">
@ -90,7 +240,7 @@
</component>
<component name="PhpUnit">
<phpunit_settings>
<PhpUnitSettings custom_loader_path="$PROJECT_DIR$/vendor/autoload.php" />
<PhpUnitSettings configuration_file_path="$PROJECT_DIR$/hesabixCore/phpunit.xml.dist" custom_loader_path="$PROJECT_DIR$/hesabixCore/vendor/autoload.php" use_configuration_file="true" />
</phpunit_settings>
</component>
<component name="PsalmOptionsConfiguration">

10
.idea/phpunit.xml Normal file
View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="PHPUnit">
<option name="directories">
<list>
<option value="$PROJECT_DIR$/hesabixCore/tests" />
</list>
</option>
</component>
</project>

11
.project Normal file
View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>html</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
</buildSpec>
<natures>
</natures>
</projectDescription>

View file

@ -24,5 +24,5 @@ CORS_ALLOW_ORIGIN='^https?://(localhost|127\.0\.0\.1)(:[0-9]+)?$'
MESSENGER_TRANSPORT_DSN=doctrine://default?auto_setup=0
###< symfony/messenger ###
###> symfony/mailer ###
# MAILER_DSN=null://null
MAILER_DSN=null://null
###< symfony/mailer ###

BIN
hesabixCore/.gitignore vendored

Binary file not shown.

22
hesabixCore/.project Normal file
View file

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>hesabixCore</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.wst.validation.validationbuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.dltk.core.scriptbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.php.core.PHPNature</nature>
</natures>
</projectDescription>

View file

@ -1,41 +0,0 @@
import './bootstrap.js';
/*
* Welcome to your app's main JavaScript file!
*
* We recommend including the built version of this JavaScript file
* (and its CSS file) in your base layout (base.html.twig).
*/
import { createApp } from 'vue'
import router from './vue/router/router.js'
import {createRouter, createWebHashHistory, createWebHistory} from 'vue-router'
// any CSS you import will output into a single css file (app.css in this case)
import './styles/app.css';
// start the Stimulus application
import './bootstrap';
// assets/app.js
import { registerVueControllerComponents } from '@symfony/ux-vue';
import App from "./vue/views/App.vue";
// Registers Vue.js controller components to allow loading them from Twig
//
// Vue.js controller components are components that are meant to be rendered
// from Twig. These component can then rely on other components that won't be
// called directly from Twig.
//
// By putting only controller components in `vue/controllers`, you ensure that
// internal components won't be automatically included in your JS built file if
// they are not necessary.
registerVueControllerComponents(require.context('./vue/views', true, /\.vue$/));
// If you prefer to lazy-load your Vue.js controller components, in order to keep the JavaScript bundle the smallest as possible,
// and improve performance, you can use the following line instead:
//registerVueControllerComponents(require.context('./vue/controllers', true, /\.vue$/, 'lazy'));
const app = createApp(App);
app.use(router);
app.mount('#page-container')
registerVueControllerComponents(require.context('./vue/controllers', true, /\.vue$/));

View file

@ -1,11 +0,0 @@
import { startStimulusApp } from '@symfony/stimulus-bridge';
// Registers Stimulus controllers from controllers.json and in the controllers/ directory
export const app = startStimulusApp(require.context(
'@symfony/stimulus-bridge/lazy-controller-loader!./controllers',
true,
/\.[jt]sx?$/
));
// register any custom, 3rd party controllers here
// app.register('some_controller_name', SomeImportedController);

View file

@ -1,11 +0,0 @@
{
"controllers": {
"@symfony/ux-vue": {
"vue": {
"enabled": true,
"fetch": "eager"
}
}
},
"entrypoints": []
}

View file

@ -1,16 +0,0 @@
import { Controller } from '@hotwired/stimulus';
/*
* This is an example Stimulus controller!
*
* Any element with a data-controller="hello" attribute will cause
* this controller to be executed. The name "hello" comes from the filename:
* hello_controller.js -> "hello"
*
* Delete this file or adapt it for your use!
*/
export default class extends Controller {
connect() {
this.element.textContent = 'Hello Stimulus! Edit me in assets/controllers/hello_controller.js';
}
}

View file

@ -1,3 +0,0 @@
body {
background-color: lightgray;
}

View file

@ -1,9 +0,0 @@
<template>
<div>Hello {{ name }}!</div>
</template>
<script setup>
defineProps({
name: String
});
</script>

View file

@ -1,21 +0,0 @@
<template>
<div>
This is test component
</div>
</template>
<script>
export default {
name: "test",
data: ()=>{return {
searchValue: '',
}},
mounted() {
}
}
</script>
<style scoped>
</style>

View file

@ -1,14 +0,0 @@
import {createRouter, createWebHashHistory, createWebHistory} from 'vue-router'
import test from '../controllers/test.vue'
const router = createRouter({
history: createWebHistory(),
routes: [
{
path: '/tms',
name: 'app_home',
component: test
}
]
})
export default router

View file

@ -1,43 +0,0 @@
<script>
export default {
data(){
return {
}
},
beforeMount() {
alert();
},
created() {
},
methods:{
},
async mounted() {
},
components:{
}
}
</script>
<template>
<div>
This is From App view
</div>
<RouterView />
</template>
<style>
.customize-table {
--easy-table-header-font-color: #e1e1e1;
--easy-table-header-background-color: #055bbb;
}
.form-control ,.form-select{
font-family: 'vazir', sans-serif;
}
</style>

View file

@ -1,35 +0,0 @@
<template>
<!-- Your Block -->
<div class="block block-content-full">
<div class="block-header block-header-default" style="background-color: #0E2231">
<h3 class="block-title text-white"> پیشخوان </h3>
<div class="block-options">
<button class="btn-block-option" data-action="fullscreen_toggle" data-toggle="block-option" type="button"></button>
<button class="btn-block-option" data-action="pinned_toggle" data-toggle="block-option" type="button">
<i class="si si-pin"></i>
</button>
<button class="btn-block-option" data-action="state_toggle" data-action-mode="demo" data-toggle="block-option" type="button">
<i class="si si-refresh"></i>
</button>
<button class="btn-block-option" data-action="content_toggle" data-toggle="block-option" type="button"></button>
<button class="btn-block-option" data-action="close" data-toggle="block-option" type="button">
<i class="si si-close"></i>
</button>
</div>
</div>
<div class="block-content">
<p>پیشخوان</p>
</div>
</div>
<!-- END Your Block -->
</template>
<script>
export default {
name: "base"
}
</script>
<style scoped>
</style>

View file

@ -1,78 +0,0 @@
<template>
<div class="container-fluid mt-3">
<div class="row">
<div class="col-12">
<div class="row items-push">
<div class="col-6 col-lg-3">
<router-link class="block block-rounded block-link-shadow text-center h-100 mb-0" to="/acc/persons/list">
<div class="block-content py-5">
<div class="fs-3 fw-semibold text-primary mb-1">{{stat.personCount}}</div>
<p class="fw-semibold fs-sm text-muted text-uppercase mb-0">
<i class="fa fa-users"></i>
<br>
اشخاص و مشتریان
</p>
</div>
</router-link>
</div>
<div class="col-6 col-lg-3">
<router-link class="block block-rounded block-link-shadow text-center h-100 mb-0" to="/acc/banks/list">
<div class="block-content py-5">
<div class="fs-3 fw-semibold text-primary mb-1">{{stat.bankCount}}</div>
<p class="fw-semibold fs-sm text-muted text-uppercase mb-0">
<i class="fa fa-bank"></i>
<br>
حسابهای بانکی
</p>
</div>
</router-link>
</div>
<div class="col-6 col-lg-3">
<router-link class="block block-rounded block-link-shadow text-center h-100 mb-0" to="/acc/accounting/list">
<div class="block-content py-5">
<div class="fs-3 fw-semibold text-primary mb-1">{{ stat.docCount }}</div>
<p class="fw-semibold fs-sm text-muted text-uppercase mb-0">
<i class="fa fa-book-open-reader"></i>
<br>
لیست اسناد
</p>
</div>
</router-link>
</div>
<div class="col-6 col-lg-3">
<router-link class="block block-rounded block-link-shadow text-center h-100 mb-0" to="/acc/reports/list">
<div class="block-content py-5">
<div class="fs-3 fw-semibold mb-1 text-primary">{{ this.$filters.formatNumber(stat.income) }}</div>
<p class="fw-semibold fs-sm text-muted text-uppercase mb-0">
<i class="fa fa-chart-line"></i>
<br>
گردش مالی
</p>
</div>
</router-link>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import axios from "axios";
export default {
name: "dashboard",
data:()=>{return {
stat:{}
}},
beforeMount() {
axios.post('/api/business/stat').then((response)=>{
this.stat = response.data
})
}
}
</script>
<style scoped>
</style>

View file

@ -45,10 +45,8 @@
"symfony/string": "6.2.*",
"symfony/translation": "6.2.*",
"symfony/twig-bundle": "6.2.*",
"symfony/ux-vue": "^2.9",
"symfony/validator": "6.2.*",
"symfony/web-link": "6.2.*",
"symfony/webpack-encore-bundle": "^2.0",
"symfony/yaml": "6.2.*",
"symfonycasts/verify-email-bundle": "^1.13",
"tecnickcom/tcpdf": "^6.6",

View file

@ -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": "4283b361d2fc6c23d255821e9bea4da6",
"content-hash": "4c8d0955f3c2cbf3cafa3f36b67a1c6a",
"packages": [
{
"name": "doctrine/annotations",
@ -7477,74 +7477,6 @@
],
"time": "2023-05-23T14:45:45+00:00"
},
{
"name": "symfony/stimulus-bundle",
"version": "v2.12.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/stimulus-bundle.git",
"reference": "e0e19de8df4d5b2bed57328ae69ef7904df660c7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/stimulus-bundle/zipball/e0e19de8df4d5b2bed57328ae69ef7904df660c7",
"reference": "e0e19de8df4d5b2bed57328ae69ef7904df660c7",
"shasum": ""
},
"require": {
"php": ">=8.1",
"symfony/config": "^5.4|^6.0",
"symfony/dependency-injection": "^5.4|^6.0",
"symfony/finder": "^5.4|^6.0",
"symfony/http-kernel": "^5.4|^6.0",
"twig/twig": "^2.15.3|^3.4.3"
},
"require-dev": {
"symfony/asset-mapper": "^6.3",
"symfony/framework-bundle": "^5.4|^6.0",
"symfony/phpunit-bridge": "^5.4|^6.0",
"symfony/twig-bundle": "^5.4|^6.0",
"zenstruck/browser": "^1.4"
},
"type": "symfony-bundle",
"autoload": {
"psr-4": {
"Symfony\\UX\\StimulusBundle\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Integration with your Symfony app & Stimulus!",
"keywords": [
"symfony-ux"
],
"support": {
"source": "https://github.com/symfony/stimulus-bundle/tree/v2.12.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2023-08-28T18:00:50+00:00"
},
{
"name": "symfony/stopwatch",
"version": "v6.2.7",
@ -8078,86 +8010,6 @@
],
"time": "2023-02-14T08:44:56+00:00"
},
{
"name": "symfony/ux-vue",
"version": "v2.12.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/ux-vue.git",
"reference": "f2e77ed1a162d4888c13d200ee5ae6821b8ff5c9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/ux-vue/zipball/f2e77ed1a162d4888c13d200ee5ae6821b8ff5c9",
"reference": "f2e77ed1a162d4888c13d200ee5ae6821b8ff5c9",
"shasum": ""
},
"require": {
"php": ">=8.1",
"symfony/stimulus-bundle": "^2.9.1"
},
"require-dev": {
"symfony/asset-mapper": "6.3.x-dev",
"symfony/finder": "^5.4|^6.0",
"symfony/framework-bundle": "^5.4|^6.0",
"symfony/phpunit-bridge": "^5.4|^6.0",
"symfony/twig-bundle": "^5.4|^6.0",
"symfony/var-dumper": "^5.4|^6.0"
},
"type": "symfony-bundle",
"extra": {
"thanks": {
"name": "symfony/ux",
"url": "https://github.com/symfony/ux"
}
},
"autoload": {
"psr-4": {
"Symfony\\UX\\Vue\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Titouan Galopin",
"email": "galopintitouan@gmail.com"
},
{
"name": "Thibault Richard",
"email": "thibault.richard62@gmail.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Integration of Vue.js in Symfony",
"homepage": "https://symfony.com",
"keywords": [
"symfony-ux"
],
"support": {
"source": "https://github.com/symfony/ux-vue/tree/v2.12.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2023-07-09T15:31:47+00:00"
},
{
"name": "symfony/validator",
"version": "v6.2.13",
@ -8513,77 +8365,6 @@
],
"time": "2023-02-14T08:44:56+00:00"
},
{
"name": "symfony/webpack-encore-bundle",
"version": "v2.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/webpack-encore-bundle.git",
"reference": "50d4af5cca35dab66a51dfeeb63616937ba96f4a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/webpack-encore-bundle/zipball/50d4af5cca35dab66a51dfeeb63616937ba96f4a",
"reference": "50d4af5cca35dab66a51dfeeb63616937ba96f4a",
"shasum": ""
},
"require": {
"php": ">=8.1.0",
"symfony/asset": "^5.4 || ^6.2 || ^7.0",
"symfony/config": "^5.4 || ^6.2 || ^7.0",
"symfony/dependency-injection": "^5.4 || ^6.2 || ^7.0",
"symfony/http-kernel": "^5.4 || ^6.2 || ^7.0",
"symfony/service-contracts": "^1.1.9 || ^2.1.3 || ^3.0"
},
"require-dev": {
"symfony/framework-bundle": "^5.4 || ^6.2 || ^7.0",
"symfony/phpunit-bridge": "^5.4 || ^6.2 || ^7.0",
"symfony/twig-bundle": "^5.4 || ^6.2 || ^7.0",
"symfony/web-link": "^5.4 || ^6.2 || ^7.0"
},
"type": "symfony-bundle",
"extra": {
"thanks": {
"name": "symfony/webpack-encore",
"url": "https://github.com/symfony/webpack-encore"
}
},
"autoload": {
"psr-4": {
"Symfony\\WebpackEncoreBundle\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Integration with your Symfony app & Webpack Encore!",
"support": {
"issues": "https://github.com/symfony/webpack-encore-bundle/issues",
"source": "https://github.com/symfony/webpack-encore-bundle/tree/v2.1.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2023-09-26T14:41:29+00:00"
},
{
"name": "symfony/yaml",
"version": "v6.2.10",

View file

@ -14,8 +14,5 @@ return [
Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true],
Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true],
Gregwar\CaptchaBundle\GregwarCaptchaBundle::class => ['all' => true],
Symfony\WebpackEncoreBundle\WebpackEncoreBundle::class => ['all' => true],
Symfony\UX\StimulusBundle\StimulusBundle::class => ['all' => true],
Symfony\UX\Vue\VueBundle::class => ['all' => true],
FOS\CKEditorBundle\FOSCKEditorBundle::class => ['all' => true],
];

View file

@ -1,45 +0,0 @@
webpack_encore:
# The path where Encore is building the assets - i.e. Encore.setOutputPath()
output_path: '%kernel.project_dir%/public/build'
# If multiple builds are defined (as shown below), you can disable the default build:
# output_path: false
# Set attributes that will be rendered on all script and link tags
script_attributes:
defer: true
# Uncomment (also under link_attributes) if using Turbo Drive
# https://turbo.hotwired.dev/handbook/drive#reloading-when-assets-change
# 'data-turbo-track': reload
# link_attributes:
# Uncomment if using Turbo Drive
# 'data-turbo-track': reload
# If using Encore.enableIntegrityHashes() and need the crossorigin attribute (default: false, or use 'anonymous' or 'use-credentials')
# crossorigin: 'anonymous'
# Preload all rendered script and link tags automatically via the HTTP/2 Link header
# preload: true
# Throw an exception if the entrypoints.json file is missing or an entry is missing from the data
# strict_mode: false
# If you have multiple builds:
# builds:
# frontend: '%kernel.project_dir%/public/frontend/build'
# pass the build name as the 3rd argument to the Twig functions
# {{ encore_entry_script_tags('entry1', null, 'frontend') }}
framework:
assets:
json_manifest_path: '%kernel.project_dir%/public/build/manifest.json'
#when@prod:
# webpack_encore:
# # Cache the entrypoints.json (rebuild Symfony's cache when entrypoints.json changes)
# # Available in version 1.2
# cache: true
#when@test:
# webpack_encore:
# strict_mode: false

View file

@ -39,6 +39,7 @@ services:
arguments: [ "@doctrine.orm.entity_manager" ]
twigFunctions:
class: App\Service\twigFunctions
arguments: [ "@doctrine.orm.entity_manager" ]
Access:
class: App\Service\Access
arguments: [ "@doctrine.orm.entity_manager","@Symfony.Component.Security.Core.Authentication.Token.Storage.TokenStorageInterface","@Symfony.Component.HttpFoundation.RequestStack" ]

View file

@ -1,31 +0,0 @@
{
"devDependencies": {
"@babel/core": "^7.17.0",
"@babel/preset-env": "^7.16.0",
"@hotwired/stimulus": "^3.0.0",
"@symfony/stimulus-bridge": "^3.2.0",
"@symfony/stimulus-bundle": "file:vendor/symfony/stimulus-bundle/assets",
"@symfony/ux-vue": "file:vendor/symfony/ux-vue/assets",
"@symfony/webpack-encore": "^4.0.0",
"core-js": "^3.23.0",
"regenerator-runtime": "^0.13.9",
"vue": "^3.0",
"vue-loader": "^17.2.2",
"webpack": "^5.74.0",
"webpack-cli": "^4.10.0",
"webpack-notifier": "^1.15.0"
},
"license": "UNLICENSED",
"private": true,
"scripts": {
"dev-server": "encore dev-server",
"dev": "encore dev",
"watch": "encore dev --watch",
"build": "encore production --progress"
},
"dependencies": {
"axios": "^1.4.0",
"sweetalert2": "^11.7.12",
"vue-router": "^4.2.2"
}
}

View file

@ -1,14 +0,0 @@
{
"entrypoints": {
"app": {
"js": [
"http://localhost:8080/build/runtime.js",
"http://localhost:8080/build/vendors-node_modules_symfony_stimulus-bridge_dist_index_js-node_modules_core-js_modules_es_ar-728fb7.js",
"http://localhost:8080/build/app.js"
],
"css": [
"http://localhost:8080/build/app.css"
]
}
}
}

View file

@ -1,8 +0,0 @@
{
"build/app.css": "http://localhost:8080/build/app.css",
"build/app.js": "http://localhost:8080/build/app.js",
"build/runtime.js": "http://localhost:8080/build/runtime.js",
"build/vendors-node_modules_symfony_stimulus-bridge_dist_index_js-node_modules_core-js_modules_es_ar-d69614.js": "http://localhost:8080/build/vendors-node_modules_symfony_stimulus-bridge_dist_index_js-node_modules_core-js_modules_es_ar-d69614.js",
"build/vendors-node_modules_symfony_stimulus-bridge_dist_index_js-node_modules_core-js_modules_es_ar-20f0d6.js": "http://localhost:8080/build/vendors-node_modules_symfony_stimulus-bridge_dist_index_js-node_modules_core-js_modules_es_ar-20f0d6.js",
"build/vendors-node_modules_symfony_stimulus-bridge_dist_index_js-node_modules_core-js_modules_es_ar-728fb7.js": "http://localhost:8080/build/vendors-node_modules_symfony_stimulus-bridge_dist_index_js-node_modules_core-js_modules_es_ar-728fb7.js"
}

View file

@ -16,7 +16,7 @@ use Symfony\Component\Routing\Annotation\Route;
class BankController extends AbstractController
{
#[Route('/api/bank/list', name: 'app_bank_list')]
public function app_bank_list(Request $request,Access $access,Log $log,EntityManagerInterface $entityManager): JsonResponse
public function app_bank_list(Provider $provider,Request $request,Access $access,Log $log,EntityManagerInterface $entityManager): JsonResponse
{
if(!$access->hasRole('banks'))
throw $this->createAccessDeniedException();
@ -35,7 +35,7 @@ class BankController extends AbstractController
}
$data->setBalance($bd - $bs);
}
return $this->json($datas);
return $this->json($provider->ArrayEntity2Array($datas,0));
}
#[Route('/api/bank/info/{code}', name: 'app_bank_info')]
@ -48,7 +48,7 @@ class BankController extends AbstractController
'bid'=>$acc['bid'],
'code'=>$code
]);
return $this->json($data);
return $this->json($provider->Entity2Array($data,0));
}
#[Route('/api/bank/mod/{code}', name: 'app_bank_mod')]

View file

@ -16,8 +16,10 @@ use App\Entity\Year;
use App\Service\Access;
use App\Service\Jdate;
use App\Service\Log;
use App\Service\Provider;
use Doctrine\ORM\EntityManagerInterface;
use ReflectionException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
@ -45,8 +47,11 @@ class BusinessController extends AbstractController
return $this->json($response);
}
/**
* @throws ReflectionException
*/
#[Route('/api/business/get/info/{bid}', name: 'api_business_get_info')]
public function api_business_get_info($bid,#[CurrentUser] ?User $user,EntityManagerInterface $entityManager): Response
public function api_business_get_info($bid,#[CurrentUser] ?User $user,Provider $provider,EntityManagerInterface $entityManager): Response
{
$bus = $entityManager->getRepository(Business::class)->findOneBy(['id'=>$bid]);
$response = [];
@ -72,6 +77,11 @@ class BusinessController extends AbstractController
$response['type'] = $bus->getType();
$response['zarinpalCode'] = $bus->getZarinpalCode();
$response['smsCharge'] = $bus->getSmsCharge();
$response['shortlinks'] = $bus->isShortLinks();
$response['walletEnabled'] = $bus->isWalletEnable();
$response['walletMatchBank'] = null;
if($bus->isWalletEnable())
$response['walletMatchBank'] = $provider->Entity2Array($bus->getWalletMatchBank(),0);
return $this->json($response);
}
@ -95,65 +105,85 @@ class BusinessController extends AbstractController
trim($params['name']) != '' &&
trim($params['legal_name']) != '' &&
trim($params['maliyatafzode']) != ''
){
) {
//submit business
$isNew = false;
if(array_key_exists('bid',$params)){
if (array_key_exists('bid', $params)) {
$business = $entityManager->getRepository(Business::class)->find($params['bid']);
if(! $business) {
return $this->json(['result'=>-1]);
if (!$business) {
return $this->json(['result' => -1]);
}
}
else{
} else {
$business = new Business();
$business->setPersonCode(1000);
$business->setBankCode(1000);
$business->setReceiveCode(1000);
$isNew = true;
}
if(!$isNew && !$access->hasRole('settings'))
if (!$isNew && !$access->hasRole('settings'))
throw $this->createAccessDeniedException();
//check for that user register business before
$oldBid = $entityManager->getRepository(Business::class)->findOneBy(['owner'=>$this->getUser()],['id'=>'DESC']);
if($oldBid && !$business->getId()){
if($oldBid->getDateSubmit() > time()-86400){
return $this->json(['result'=>3]);
$oldBid = $entityManager->getRepository(Business::class)->findOneBy(['owner' => $this->getUser()], ['id' => 'DESC']);
if ($oldBid && !$business->getId()) {
if ($oldBid->getDateSubmit() > time() - 86400) {
return $this->json(['result' => 3]);
}
}
$business->setName($params['name']);
$business->setOwner($this->getUser());
$business->setLegalName($params['legal_name']);
$business->setMaliyatafzode($params['maliyatafzode']);
if($params['field'])
if ($params['field'])
$business->setField($params['field']);
if($params['type'])
if ($params['type'])
$business->setType($params['type']);
if($params['shenasemeli'])
if ($params['shenasemeli'])
$business->setShenasemeli($params['shenasemeli']);
if($params['codeeqtesadi'])
if ($params['codeeqtesadi'])
$business->setCodeeghtesadi($params['codeeqtesadi']);
if($params['shomaresabt'])
if ($params['shomaresabt'])
$business->setShomaresabt($params['shomaresabt']);
if($params['country'])
if ($params['country'])
$business->setCountry($params['country']);
if($params['ostan'])
if ($params['ostan'])
$business->setOstan($params['ostan']);
if($params['shahrestan'])
if ($params['shahrestan'])
$business->setShahrestan($params['shahrestan']);
if($params['postalcode'])
if ($params['postalcode'])
$business->setPostalcode($params['postalcode']);
if(array_key_exists('zarinpalCode',$params))
if (array_key_exists('zarinpalCode', $params))
$business->setZarinpalCode($params['zarinpalCode']);
if($params['tel'])
if (array_key_exists('shortlinks', $params))
$business->setShortlinks($params['shortlinks']);
if ($params['tel'])
$business->setTel($params['tel']);
if($params['mobile'])
if ($params['mobile'])
$business->setMobile($params['mobile']);
if($params['address'])
if ($params['address'])
$business->setAddress($params['address']);
if($params['website'])
if ($params['website'])
$business->setWesite($params['website']);
if($params['email'])
if ($params['email'])
$business->setEmail($params['email']);
if (array_key_exists('walletEnabled', $params)){
if ($params['walletEnabled']) {
if (array_key_exists('walletMatchBank', $params)) {
$bank = $entityManager->getRepository(BankAccount::class)->findOneBy([
'bid' => $business->getId(),
'id' => $params['walletMatchBank']['id']
]);
if ($bank) {
$business->setWalletEnable($params['walletEnabled']);
$business->setWalletMatchBank($bank);
}
}
}
else{
$business->setWalletEnable(false);
}
}
//get Money type
if($params['arzmain']){
$Arzmain = $entityManager->getRepository(Money::class)->findOneBy(['name'=>$params['arzmain']]);
@ -190,6 +220,7 @@ class BusinessController extends AbstractController
$perms->setPermission(true);
$perms->setSalary(true);
$perms->setCashdesk(true);
$perms->setWallet(true);
$entityManager->persist($perms);
$entityManager->flush();
//active Year
@ -353,6 +384,7 @@ class BusinessController extends AbstractController
'plugNoghreAdmin'=>true,
'plugNoghreSell'=>true,
'plugCCAdmin'=>true,
'wallet'=>true,
'owner'=> true,
'active'=> $perm->getUser()->isActive()
];
@ -382,6 +414,7 @@ class BusinessController extends AbstractController
'plugNoghreAdmin'=>$perm->isPlugNoghreAdmin(),
'plugNoghreSell'=>$perm->isPlugNoghreSell(),
'plugCCAdmin'=>$perm->isPlugCCAdmin(),
'wallet'=>$perm->isWallet(),
'owner'=> false,
'active'=> $perm->getUser()->isActive()
];
@ -435,6 +468,7 @@ class BusinessController extends AbstractController
$perm->setReport($params['report']);
$perm->setPermission($params['permission']);
$perm->setSalary($params['salary']);
$perm->setWallet($params['wallet']);
$perm->setCashdesk($params['cashdesk']);
$perm->setPlugNoghreAdmin($params['plugNoghreAdmin']);
$perm->setPlugNoghreSell($params['plugNoghreSell']);

View file

@ -41,6 +41,9 @@ class CommodityController extends AbstractController
$temp['cat'] = null;
if($item->getCat())
$temp['cat'] = $item->getCat()->getName();
$temp['khadamat'] = false;
if($item->isKhadamat())
$temp['khadamat'] = true;
$res[] = $temp;
}
return $this->json($res);

View file

@ -0,0 +1,224 @@
<?php
namespace App\Controller\Front;
use App\Entity\HesabdariDoc;
use App\Entity\HesabdariRow;
use App\Entity\HesabdariTable;
use App\Entity\PayInfoTemp;
use App\Entity\Settings;
use App\Entity\User;
use App\Entity\WalletTransaction;
use App\Entity\Year;
use App\Service\Jdate;
use App\Service\Log;
use App\Service\Notification;
use App\Service\Provider;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class PayController extends AbstractController
{
#[Route('/pay/sell/{id}', name: 'pay_sell')]
public function pay_sell(String $id,EntityManagerInterface $entityManager,Log $log): Response
{
$doc = $entityManager->getRepository(HesabdariDoc::class)->find($id);
if(!$doc)
throw $this->createNotFoundException();
//calculate total pays
$totalPays = 0;
if($doc->getWalletTransaction())
$totalPays += $doc->getWalletTransaction()->getAmount();
foreach ($doc->getRelatedDocs() as $relatedDoc)
$totalPays += $relatedDoc->getAmount();
$amountPay = $doc->getAmount() - $totalPays;
//get system settings
$settings = $entityManager->getRepository(Settings::class)->findAll()[0];
$data = array("merchant_id" => $settings->getZarinpalMerchant(),
"amount" => $amountPay,
"callback_url" => $this->generateUrl('pay_sell_verify',['id'=>$doc->getId()],UrlGeneratorInterface::ABSOLUTE_URL),
"description" => 'پرداخت فاکتور شماره ' . $doc->getCode() . ' کسب و کار ' .$doc->getBid()->getLegalName(),
);
$jsonData = json_encode($data);
$ch = curl_init('https://api.zarinpal.com/pg/v4/payment/request.json');
curl_setopt($ch, CURLOPT_USERAGENT, 'ZarinPal Rest Api v1');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($jsonData)
));
$result = curl_exec($ch);
$err = curl_error($ch);
$result = json_decode($result, true, JSON_PRETTY_PRINT);
curl_close($ch);
if ($err) {
throw $this->createAccessDeniedException($err);
} else {
if (empty($result['errors'])) {
if ($result['data']['code'] == 100) {
$tempPay = new PayInfoTemp();
$tempPay->setBid($doc->getBid());
$tempPay->setDateSubmit(time());
$tempPay->setDes('پرداخت فاکتور شماره ' . $doc->getCode() . ' کسب و کار ' .$doc->getBid()->getLegalName());
$tempPay->setPrice($amountPay);
$tempPay->setStatus(0);
$tempPay->setDoc($doc);
$tempPay->setVerifyCode($result['data']['authority']);
$tempPay->setGatePay('zarinpal');
$entityManager->persist($tempPay);
$entityManager->flush();
$log->insert('کیف پول','ایجاد تراکنش پرداخت برای فاکتور فروش ' . $doc->getCode() ,$this->getUser(),$doc->getBid());
return $this->redirect('https://www.zarinpal.com/pg/StartPay/' . $result['data']["authority"]);
}
}
}
return $this->render('pay/fail.html.twig',[
'type'=>'sell',
'doc'=>$doc
]);
}
#[Route('pay/sell/verify/{id}', name: 'pay_sell_verify')]
public function pay_sell_verify(String $id, Notification $notification,Provider $provider,Jdate $jdate,Request $request,EntityManagerInterface $entityManager,Log $log): Response
{
$doc = $entityManager->getRepository(HesabdariDoc::class)->find($id);
if(!$doc)
throw $this->createNotFoundException();
$Authority = $request->get('Authority');
$status = $request->get('Status');
$req = $entityManager->getRepository(PayInfoTemp::class)->findOneBy(['verifyCode'=>$Authority]);
//get system settings
$settings = $entityManager->getRepository(Settings::class)->findAll()[0];
$data = array("merchant_id" => $settings->getZarinpalMerchant(), "authority" => $Authority, "amount" => $req->getPrice());
$jsonData = json_encode($data);
$ch = curl_init('https://api.zarinpal.com/pg/v4/payment/verify.json');
curl_setopt($ch, CURLOPT_USERAGENT, 'ZarinPal Rest Api v4');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($jsonData)
));
$result = curl_exec($ch);
$err = curl_error($ch);
curl_close($ch);
$result = json_decode($result, true);
//-----------------------------------
$originalDoc = $req->getDoc();
//-----------------------------------
if ($err) {
$log->insert('کیف پول','خطا در پرداخت فاکتور فروش ' . $doc->getCode() ,$this->getUser(),$doc->getBid());
return $this->redirectToRoute('shortlinks_show',['type'=>'sell','bid'=>$originalDoc->getBid()->getId(),'link'=>$originalDoc->getId(),'msg'=>'fail']);
} else {
if(array_key_exists('code',$result['data'])){
if ($result['data']['code'] == 100) {
$req->setStatus(100);
$req->setRefID($result['data']['ref_id']);
$req->setCardPan($result['data']['card_pan']);
$entityManager->persist($req);
$entityManager->flush();
//create wallet transaction
$wt = new WalletTransaction();
$wt->setBid($req->getBid());
$wt->setDes($req->getDes());
$wt->setDateSubmit($req->getDateSubmit());
$wt->setGatePay($req->getGatePay());
$wt->setStatus($req->getStatus());
$wt->setVerifyCode($req->getVerifyCode());
$wt->setRefID($req->getRefID());
$wt->setCardPan($req->getCardPan());
$wt->setAmount($req->getPrice());
$wt->setType('sell');
$entityManager->persist($wt);
$entityManager->flush();
$doc->setWalletTransaction($wt);
$entityManager->persist($doc);
$entityManager->flush();
$entityManager->persist($originalDoc);
$entityManager->flush();
//create hesabdariDoc
$doc = new HesabdariDoc();
$doc->setBid($wt->getBid());
$doc->setDateSubmit(time());
$doc->setDate($jdate->jdate('Y/n/d',time()));
$doc->setType('walletPay');
$doc->setMoney($wt->getBid()->getMoney());
//get default year
$year = $entityManager->getRepository(Year::class)->findOneBy([
'bid'=>$originalDoc->getBid(),
'head'=>true
]);
$doc->setYear($year);
$doc->setDes($wt->getDes());
$doc->setAmount($wt->getAmount());
$doc->setCode($provider->getAccountingCode($wt->getBid(),'accounting'));
$doc->setSubmitter($entityManager->getRepository(User::class)->findOneBy(['email'=>'wallet@hesabix.ir']));
$entityManager->persist($doc);
$entityManager->flush();
$originalDoc->addRelatedDoc($doc);
$originalDoc->setWalletTransaction($wt);
$entityManager->persist($originalDoc);
$entityManager->flush();
//create rows bank
$row = new HesabdariRow();
$row->setBid($originalDoc->getBid());
$row->setDoc($doc);
$row->setBank($doc->getBid()->getWalletMatchBank());
$row->setBd($doc->getAmount());
$row->setBs(0);
$row->setDes('دریافت وجه فاکتور آنلاین شماره ' . $doc->getCode());
//get table ref
$table = $entityManager->getRepository(HesabdariTable::class)->findOneBy(['code'=>5]);
$row->setRef($table);
$row->setYear($year);
$entityManager->persist($row);
$entityManager->flush();
//create rows person
//get person
$rows = $entityManager->getRepository(HesabdariRow::class)->findBy(['doc' => $originalDoc]);
$person = null;
foreach ($rows as $oldRow) {
if ($row->getPerson())
$person = $row->getPerson();
}
$row = new HesabdariRow();
$row->setBid($originalDoc->getBid());
$row->setDoc($doc);
$row->setPerson($person);
$row->setBs($doc->getAmount());
$row->setBd(0);
$row->setDes('پرداخت وجه فاکتور آنلاین شماره ' . $doc->getCode());
//get table ref
$table = $entityManager->getRepository(HesabdariTable::class)->findOneBy(['code'=>3]);
$row->setRef($table);
$row->setYear($year);
$entityManager->persist($row);
$entityManager->flush();
$log->insert('کیف پول','پرداخت موفق فاکتور فروش ' . $originalDoc->getCode() ,$this->getUser(),$doc->getBid());
return $this->redirectToRoute('shortlinks_show',['type'=>'sell','bid'=>$originalDoc->getBid()->getId(),'link'=>$originalDoc->getId(),'msg'=>'success']);
}
}
$log->insert('کیف پول','خطا در پرداخت فاکتور فروش ' . $originalDoc->getCode() ,$this->getUser(),$doc->getBid());
return $this->redirectToRoute('shortlinks_show',['type'=>'sell','bid'=>$originalDoc->getBid()->getId(),'link'=>$originalDoc->getId(),'msg'=>'fail']);
}
}
}

View file

@ -0,0 +1,61 @@
<?php
namespace App\Controller\Front;
use App\Entity\Business;
use App\Entity\HesabdariDoc;
use App\Entity\HesabdariRow;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class ShortlinksController extends AbstractController
{
#[Route('/sl/{type}/{bid}/{link}/{msg}', name: 'shortlinks_show')]
public function shortlinks_show(string $bid, string $type, string $link, EntityManagerInterface $entityManager, String $msg = 'default'): Response
{
$bus = $entityManager->getRepository(Business::class)->find($bid);
if (!$bus)
throw $this->createNotFoundException();
if (!$bus->isShortlinks())
throw $this->createNotFoundException();
if ($type == 'sell') {
$doc = $entityManager->getRepository(HesabdariDoc::class)->findOneBy([
'type' => 'sell',
'shortlink' => $link
]);
if (!$doc) {
$doc = $entityManager->getRepository(HesabdariDoc::class)->findOneBy([
'type' => 'sell',
'id' => $link,
'bid'=>$bus
]);
if (!$doc)
throw $this->createNotFoundException();
}
$rows = $entityManager->getRepository(HesabdariRow::class)->findBy(['doc' => $doc]);
$items = [];
$person = null;
foreach ($rows as $row) {
if (!$row->getPerson())
$items[] = $row;
else
$person = $row->getPerson();
}
//calculate total pays
$totalPays = 0;
foreach ($doc->getRelatedDocs() as $relatedDoc)
$totalPays += $relatedDoc->getAmount();
}
return $this->render('shortlinks/sell.html.twig', [
'bid' => $doc->getBid(),
'doc' => $doc,
'rows' => $items,
'person'=> $person,
'totalPays'=>$totalPays,
'msg'=>$msg
]);
}
}

View file

@ -2,9 +2,12 @@
namespace App\Controller;
use App\Entity\ChangeReport;
use App\Entity\HesabdariDoc;
use App\Entity\Statment;
use App\Entity\User;
use App\Service\Access;
use App\Service\Jdate;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
@ -18,21 +21,40 @@ use App\Service\Provider;
class GeneralController extends AbstractController
{
#[Route('/api/general/stat', name: 'general_stat')]
public function general_stat(EntityManagerInterface $entityManager): JsonResponse
public function general_stat(EntityManagerInterface $entityManager,Jdate $jdate): JsonResponse
{
$busCount = count($entityManager->getRepository(Business::class)->findAll());
$users = count($entityManager->getRepository(User::class)->findAll());
$docs = count($entityManager->getRepository(HesabdariDoc::class)->findAll());
$lastBusiness = $entityManager->getRepository(Business::class)->findLast();
//get last version number
$version = '0.0.1';
$lastUpdateDate = '1399';
$lastUpdateDes = '';
$last = $entityManager->getRepository(ChangeReport::class)->findOneBy([],['id'=>'DESC']);
if($last){
$version = $last->getVersion();
$lastUpdateDate = $jdate->jdate('Y/n/d',$last->getDateSubmit());
$lastUpdateDes = $last->getBody();
}
return $this->json([
'business' => $busCount,
'users'=> $users,
'docs'=> $docs,
'version'=>$version,
'lastUpdateDate'=>$lastUpdateDate,
'lastUpdateDes'=>$lastUpdateDes,
'lastBusinessName'=> $lastBusiness->getname(),
'lastBusinessOwner'=>$lastBusiness->getOwner()->getFullName()
]);
}
#[Route('/api/general/statements', name: 'general_statement')]
public function general_statement(EntityManagerInterface $entityManager,Jdate $jdate): JsonResponse
{
return $this->json($entityManager->getRepository(Statment::class)->findBy([],['id'=>'DESC']));
}
#[Route('/front/print/{id}', name: 'app_front_print')]
public function app_front_print(Provider $provider,EntityManagerInterface $entityManager,pdfMGR $pdfMGR,String $id)
{

View file

@ -71,6 +71,9 @@ class HesabdariController extends AbstractController
'mobile' => $item->getPerson()->getMobile(),
'address' => $item->getPerson()->getAddress(),
'des' => $item->getPerson()->getDes(),
'shomaresabt' => $item->getperson()->getSabt(),
'codeeghtesadi' =>$item->getPerson()->getCodeeghtesadi(),
'postalcode' => $item->getPerson()->getPostalCode()
];
}
elseif($item->getBank()){
@ -97,11 +100,14 @@ class HesabdariController extends AbstractController
$temp['type'] = 'commodity';
$temp['ref'] = $item->getCommodity()->getName();
$temp['refCode'] = $item->getCommodity()->getCode();
$temp['count'] = $item->getCommdityCount();
$temp['unitPrice'] = $item->getBs()/$item->getCommdityCount();
$temp['commodity'] = [
'id' => $item->getCommodity()->getId(),
'name' => $item->getCommodity()->getName(),
'des' => $item->getCommodity()->getDes(),
'code' => $item->getCommodity()->getCode(),
'unit' => $item->getCommodity()->getUnit()->getName(),
];
}
elseif($item->getSalary()){
@ -136,9 +142,21 @@ class HesabdariController extends AbstractController
}
$rows[] = $temp;
}
//get related docs
$rds = [];
foreach ($doc->getRelatedDocs() as $relatedDoc){
$temp = [];
$temp['amount'] = $relatedDoc->getAmount();
$temp['des'] = $relatedDoc->getDes();
$temp['date'] = $relatedDoc->getDate();
$temp['type'] = $relatedDoc->getType();
$temp['code'] = $relatedDoc->getCode();
$rds[] = $temp;
}
return $this->json([
'doc'=>$doc,
'rows'=>$rows
'rows'=>$rows,
'relatedDocs'=>$rds
]);
}
@ -157,6 +175,7 @@ class HesabdariController extends AbstractController
elseif($params['type'] == 'income') $roll='income';
elseif($params['type'] == 'buy') $roll='buy';
elseif($params['type'] == 'transfer') $roll='transfer';
elseif($params['type'] == 'sell') $roll='sell';
elseif($params['type'] == 'all') $roll='accounting';
else
$this->createNotFoundException();
@ -193,10 +212,21 @@ class HesabdariController extends AbstractController
'amount'=>$item->getAmount(),
'submitter'=> $item->getSubmitter()->getFullName(),
];
if($params['type'] == 'buy'){
if($params['type'] == 'buy' || $params['type'] == 'sell'){
$mainRow = $entityManager->getRepository(HesabdariRow::class)->getNotEqual($item,'person');
$temp['person'] = $mainRow->getPerson()->getNikename();
}
//get status of doc
$temp['status'] = 'تسویه نشده';
$pays = 0;
foreach ($item->getRelatedDocs() as $relatedDoc){
$pays += $relatedDoc->getAmount();
}
if($item->getAmount() <= $pays)
$temp['status'] = 'تسویه شده';
$dataTemp[] = $temp;
}
return $this->json($dataTemp);
@ -266,6 +296,15 @@ class HesabdariController extends AbstractController
$entityManager->flush();
}
//add document to related docs
if(array_key_exists('related',$params)){
$relatedDoc = $entityManager->getRepository(HesabdariDoc::class)->findOneBy(['code'=>$params['related'],'bid'=>$doc->getBid()]);
if($relatedDoc){
$relatedDoc->addRelatedDoc($doc);
$entityManager->persist($relatedDoc);
$entityManager->flush();
}
}
$amount = 0;
foreach ($params['rows'] as $row){

View file

@ -30,7 +30,8 @@ class LogController extends AbstractController
if(array_key_exists('type',$params)){
if($params['type'] == 'sms')
$logs = $entityManager->getRepository(\App\Entity\Log::class)->findBy(['bid'=>$business,'part'=>'پیامک']);
elseif($params['type'] == 'wallet')
$logs = $entityManager->getRepository(\App\Entity\Log::class)->findBy(['bid'=>$business,'part'=>'کیف پول']);
}
else{
$logs = $entityManager->getRepository(\App\Entity\Log::class)->findBy(['bid'=>$business]);
@ -45,6 +46,7 @@ class LogController extends AbstractController
$temp['des'] = $log->getDes();
$temp['part'] = $log->getPart();
$temp['date'] = $jdate->jdate('Y/n/d H:i',$log->getDateSubmit());
$temp['ipaddress'] = $log->getIpaddress();
$temps[] = $temp;
}
return $this->json(array_reverse($temps));

View file

@ -5,6 +5,7 @@ namespace App\Controller;
use App\Entity\Business;
use App\Entity\Plugin;
use App\Entity\PluginProdect;
use App\Entity\Settings;
use App\Service\Access;
use App\Service\Jdate;
use App\Service\Log;
@ -13,6 +14,7 @@ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class PluginController extends AbstractController
{
@ -37,9 +39,11 @@ class PluginController extends AbstractController
$pp = $entityManager->getRepository(PluginProdect::class)->find($id);
if(!$pp)
throw $this->createNotFoundException('plugin not found');
$data = array("merchant_id" => "a7804652-1fb9-4b43-911c-0a1046e61be1",
//get system settings
$settings = $entityManager->getRepository(Settings::class)->findAll()[0];
$data = array("merchant_id" => $settings->getZarinpalMerchant(),
"amount" => ($pp->getPrice() * 109)/10,
"callback_url" => "https://hesabix.ir/api/plugin/buy/verify",
"callback_url" => $this->generateUrl('api_plugin_buy_verify',[],UrlGeneratorInterface::ABSOLUTE_URL),
"description" => $pp->getName(),
);
$jsonData = json_encode($data);
@ -90,7 +94,9 @@ class PluginController extends AbstractController
$Authority = $request->get('Authority');
$status = $request->get('Status');
$req = $entityManager->getRepository(Plugin::class)->findOneBy(['verifyCode'=>$Authority]);
$data = array("merchant_id" => "a7804652-1fb9-4b43-911c-0a1046e61be1", "authority" => $Authority, "amount" => $req->getPrice());
//get system settings
$settings = $entityManager->getRepository(Settings::class)->findAll()[0];
$data = array("merchant_id" => $settings->getZarinpalMerchant(), "authority" => $Authority, "amount" => $req->getPrice());
$jsonData = json_encode($data);
$ch = curl_init('https://api.zarinpal.com/pg/v4/payment/verify.json');
curl_setopt($ch, CURLOPT_USERAGENT, 'ZarinPal Rest Api v4');

View file

@ -3,6 +3,8 @@
namespace App\Controller;
use App\Entity\Business;
use App\Entity\HesabdariDoc;
use App\Entity\Settings;
use App\Entity\SMSPays;
use App\Entity\SMSSettings;
use App\Service\Access;
@ -10,12 +12,14 @@ use App\Service\Jdate;
use App\Service\Log;
use App\Service\Notification;
use App\Service\Provider;
use App\Service\SMS;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class SMSController extends AbstractController
{
@ -110,9 +114,11 @@ class SMSController extends AbstractController
if(!array_key_exists('price',$params))
throw $this->createAccessDeniedException('price not set');
$data = array("merchant_id" => "a7804652-1fb9-4b43-911c-0a1046e61be1",
//get system settings
$settings = $entityManager->getRepository(Settings::class)->findAll()[0];
$data = array("merchant_id" => $settings->getZarinpalMerchant(),
"amount" => $params['price'],
"callback_url" => "http://hesabix.local/api/sms/buy/verify",
"callback_url" => $this->generateUrl('api_sms_buy_verify',[],UrlGeneratorInterface::ABSOLUTE_URL),
"description" => 'افزایش اعتبار سرویس پیامک',
);
$jsonData = json_encode($data);
@ -162,7 +168,9 @@ class SMSController extends AbstractController
$Authority = $request->get('Authority');
$status = $request->get('Status');
$req = $entityManager->getRepository(SMSPays::class)->findOneBy(['verifyCode'=>$Authority]);
$data = array("merchant_id" => "a7804652-1fb9-4b43-911c-0a1046e61be1", "authority" => $Authority, "amount" => $req->getPrice());
//get system settings
$settings = $entityManager->getRepository(Settings::class)->findAll()[0];
$data = array("merchant_id" => $settings->getZarinpalMerchant(), "authority" => $Authority, "amount" => $req->getPrice());
$jsonData = json_encode($data);
$ch = curl_init('https://api.zarinpal.com/pg/v4/payment/verify.json');
curl_setopt($ch, CURLOPT_USERAGENT, 'ZarinPal Rest Api v4');
@ -200,7 +208,6 @@ class SMSController extends AbstractController
$req->getSubmitter(),
$req->getBid()
);
$log->insert('سرویس پیامک','پرداخت ناموفق شارژ سرویس پیامک' ,$this->getUser(),$req->getBid());
$notification->insert(' سرویس پیامک شارژ شد.','/acc/sms/panel',$req->getBid(),$req->getSubmitter());
return $this->render('buy/success.html.twig',['req'=>$req]);
}
@ -210,4 +217,37 @@ class SMSController extends AbstractController
return $this->render('buy/fail.html.twig', ['results'=>$result]);
}
}
/**
* @throws \ReflectionException
*/
#[Route('/api/sms/send/sell-invoice/{id}/{num}', name: 'api_sms_send_invoice')]
public function api_sms_send_invoice(SMS $SMS,String $id,String $num,Provider $provider,Access $access,Log $log,Request $request,EntityManagerInterface $entityManager): Response
{
$acc = $access->hasRole('sell');
if(!$acc)
throw $this->createAccessDeniedException();
$bid = $acc['bid'];
if($bid->getSmsCharge()<530)
return $this->json(['result'=>'2']);
$doc = $entityManager->getRepository(HesabdariDoc::class)->findOneBy([
'id'=>$id,
'bid'=>$bid,
'type'=>'sell'
]);
if(!$doc)
return $this->json(['result'=>3]);
$shortLink = $doc->getId();
if($doc->getShortlink())
$shortLink = $doc->getShortlink();
return $this->json(['result'=>
$SMS->sendByBalance(
[$bid->getName(),'sell/' . $bid->getId() . '/' . $shortLink],
168030,
$num,$bid,$this->getUser(),3
)]);
}
}

View file

@ -0,0 +1,53 @@
<?php
namespace App\Controller;
use App\Entity\WalletTransaction;
use App\Service\Access;
use App\Service\Jdate;
use App\Service\Provider;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
class WalletController extends AbstractController
{
#[Route('/api/wallet/info', name: 'api_wallet_info')]
public function api_wallet_info(EntityManagerInterface $entityManager,Access $access,Provider $provider): JsonResponse
{
$acc = $access->hasRole('wallet');
if(!$acc)
throw $this->createAccessDeniedException();
$items = $entityManager->getRepository(WalletTransaction::class)->findBy([
'bid' => $acc['bid'],
'status'=>100
]);
$pays = 0;
$gets = 0;
foreach ($items as $item){
if($item->getType() == 'pay') $pays += $item->getAmount();
elseif ($item->getType() == 'get' || $item->getType() == 'sell') $gets += $item->getAmount();
}
return $this->json([
'deposit' => $gets - $pays,
'transactions'=>count($items),
'turnover'=>$pays + $gets,
]);
}
#[Route('/api/wallet/transactions', name: 'api_wallet_transactions')]
public function api_wallet_transactions(Jdate $jdate,EntityManagerInterface $entityManager,Access $access,Provider $provider): JsonResponse
{
$acc = $access->hasRole('wallet');
if(!$acc)
throw $this->createAccessDeniedException();
$items = $entityManager->getRepository(WalletTransaction::class)->findBy([
'bid' => $acc['bid']
],['id'=>'DESC']);
foreach ($items as $item){
$item->setDateSubmit($jdate->jdate('Y/n/d H:i',$item->getDateSubmit()));
}
return $this->json($provider->ArrayEntity2Array($items,0));
}
}

View file

@ -7,6 +7,7 @@ use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Ignore;
#[ORM\Entity(repositoryClass: BusinessRepository::class)]
class Business
@ -136,6 +137,7 @@ class Business
#[ORM\ManyToOne]
#[ORM\JoinColumn(nullable: false)]
#[Ignore]
private ?User $owner = null;
#[ORM\Column(nullable: true)]
@ -159,6 +161,21 @@ class Business
#[ORM\OneToMany(mappedBy: 'bid', targetEntity: Storeroom::class, orphanRemoval: true)]
private Collection $storerooms;
#[ORM\Column(nullable: true)]
private ?bool $shortlinks = false;
#[ORM\OneToMany(mappedBy: 'bid', targetEntity: WalletTransaction::class, orphanRemoval: true)]
#[Ignore]
private Collection $walletTransactions;
#[ORM\ManyToOne]
#[Ignore]
private ?BankAccount $WalletMatchBank = null;
#[ORM\Column(nullable: true)]
#[Ignore]
private ?bool $walletEnable = null;
public function __construct()
{
$this->logs = new ArrayCollection();
@ -177,6 +194,7 @@ class Business
$this->sMSSettings = new ArrayCollection();
$this->commodityDrops = new ArrayCollection();
$this->storerooms = new ArrayCollection();
$this->walletTransactions = new ArrayCollection();
}
public function getId(): ?int
@ -1034,4 +1052,71 @@ class Business
return $this;
}
public function isShortlinks(): ?bool
{
if($this->shortlinks == true) return true;
return false;
}
public function setShortlinks(?bool $shortlinks): static
{
$this->shortlinks = $shortlinks;
return $this;
}
/**
* @return Collection<int, WalletTransaction>
*/
public function getWalletTransactions(): Collection
{
return $this->walletTransactions;
}
public function addWalletTransaction(WalletTransaction $walletTransaction): static
{
if (!$this->walletTransactions->contains($walletTransaction)) {
$this->walletTransactions->add($walletTransaction);
$walletTransaction->setBid($this);
}
return $this;
}
public function removeWalletTransaction(WalletTransaction $walletTransaction): static
{
if ($this->walletTransactions->removeElement($walletTransaction)) {
// set the owning side to null (unless already changed)
if ($walletTransaction->getBid() === $this) {
$walletTransaction->setBid(null);
}
}
return $this;
}
public function getWalletMatchBank(): ?BankAccount
{
return $this->WalletMatchBank;
}
public function setWalletMatchBank(?BankAccount $WalletMatchBank): static
{
$this->WalletMatchBank = $WalletMatchBank;
return $this;
}
public function isWalletEnable(): ?bool
{
return $this->walletEnable;
}
public function setWalletEnable(?bool $walletEnable): static
{
$this->walletEnable = $walletEnable;
return $this;
}
}

View file

@ -71,10 +71,25 @@ class HesabdariDoc
#[ORM\Column(length: 255, nullable: true)]
private ?string $refData = null;
#[ORM\Column(length: 255, nullable: true)]
private ?string $shortlink = null;
#[ORM\ManyToOne]
#[Ignore]
private ?WalletTransaction $walletTransaction = null;
#[ORM\ManyToMany(targetEntity: self::class)]
#[Ignore]
private Collection $relatedDocs;
#[ORM\Column(length: 255, nullable: true)]
private ?string $status = null;
public function __construct()
{
$this->hesabdariRows = new ArrayCollection();
$this->plugNoghreOrders = new ArrayCollection();
$this->relatedDocs = new ArrayCollection();
}
public function getId(): ?int
@ -297,4 +312,64 @@ class HesabdariDoc
return $this;
}
public function getShortlink(): ?string
{
return $this->shortlink;
}
public function setShortlink(?string $shortlink): static
{
$this->shortlink = $shortlink;
return $this;
}
public function getWalletTransaction(): ?WalletTransaction
{
return $this->walletTransaction;
}
public function setWalletTransaction(?WalletTransaction $walletTransaction): static
{
$this->walletTransaction = $walletTransaction;
return $this;
}
/**
* @return Collection<int, self>
*/
public function getRelatedDocs(): Collection
{
return $this->relatedDocs;
}
public function addRelatedDoc(self $relatedDoc): static
{
if (!$this->relatedDocs->contains($relatedDoc)) {
$this->relatedDocs->add($relatedDoc);
}
return $this;
}
public function removeRelatedDoc(self $relatedDoc): static
{
$this->relatedDocs->removeElement($relatedDoc);
return $this;
}
public function getStatus(): ?string
{
return $this->status;
}
public function setStatus(?string $status): static
{
$this->status = $status;
return $this;
}
}

View file

@ -28,6 +28,9 @@ class Log
#[ORM\Column(length: 255)]
private ?string $des = null;
#[ORM\Column(length: 255, nullable: true)]
private ?string $ipaddress = null;
public function getId(): ?int
{
return $this->id;
@ -92,4 +95,16 @@ class Log
return $this;
}
public function getIpaddress(): ?string
{
return $this->ipaddress;
}
public function setIpaddress(?string $ipaddress): static
{
$this->ipaddress = $ipaddress;
return $this;
}
}

View file

@ -0,0 +1,171 @@
<?php
namespace App\Entity;
use App\Repository\PayInfoTempRepository;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity(repositoryClass: PayInfoTempRepository::class)]
class PayInfoTemp
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\ManyToOne]
#[ORM\JoinColumn(nullable: false)]
private ?Business $bid = null;
#[ORM\Column(length: 255)]
private ?string $dateSubmit = null;
#[ORM\Column(length: 255, nullable: true)]
private ?string $des = null;
#[ORM\Column(length: 255)]
private ?string $price = null;
#[ORM\Column(length: 255, nullable: true)]
private ?string $status = null;
#[ORM\Column(length: 255, nullable: true)]
private ?string $verifyCode = null;
#[ORM\Column(length: 255)]
private ?string $gatePay = null;
#[ORM\ManyToOne]
private ?HesabdariDoc $doc = null;
#[ORM\Column(length: 255, nullable: true)]
private ?string $refID = null;
#[ORM\Column(length: 255, nullable: true)]
private ?string $cardPan = null;
public function getId(): ?int
{
return $this->id;
}
public function getBid(): ?Business
{
return $this->bid;
}
public function setBid(?Business $bid): static
{
$this->bid = $bid;
return $this;
}
public function getDateSubmit(): ?string
{
return $this->dateSubmit;
}
public function setDateSubmit(string $dateSubmit): static
{
$this->dateSubmit = $dateSubmit;
return $this;
}
public function getDes(): ?string
{
return $this->des;
}
public function setDes(?string $des): static
{
$this->des = $des;
return $this;
}
public function getPrice(): ?string
{
return $this->price;
}
public function setPrice(string $price): static
{
$this->price = $price;
return $this;
}
public function getStatus(): ?string
{
return $this->status;
}
public function setStatus(?string $status): static
{
$this->status = $status;
return $this;
}
public function getVerifyCode(): ?string
{
return $this->verifyCode;
}
public function setVerifyCode(?string $verifyCode): static
{
$this->verifyCode = $verifyCode;
return $this;
}
public function getGatePay(): ?string
{
return $this->gatePay;
}
public function setGatePay(string $gatePay): static
{
$this->gatePay = $gatePay;
return $this;
}
public function getDoc(): ?HesabdariDoc
{
return $this->doc;
}
public function setDoc(?HesabdariDoc $doc): static
{
$this->doc = $doc;
return $this;
}
public function getRefID(): ?string
{
return $this->refID;
}
public function setRefID(?string $refID): static
{
$this->refID = $refID;
return $this;
}
public function getCardPan(): ?string
{
return $this->cardPan;
}
public function setCardPan(?string $cardPan): static
{
$this->cardPan = $cardPan;
return $this;
}
}

View file

@ -84,6 +84,9 @@ class Permission
#[ORM\Column(nullable: true)]
private ?bool $store = null;
#[ORM\Column(nullable: true)]
private ?bool $wallet = null;
public function getId(): ?int
{
return $this->id;
@ -364,4 +367,16 @@ class Permission
return $this;
}
public function isWallet(): ?bool
{
return $this->wallet;
}
public function setWallet(?bool $wallet): static
{
$this->wallet = $wallet;
return $this;
}
}

View file

@ -22,6 +22,9 @@ class Settings
#[ORM\Column(nullable: true)]
private ?bool $activeSendSms = null;
#[ORM\Column(length: 255, nullable: true)]
private ?string $zarinpalMerchant = null;
public function getId(): ?int
{
return $this->id;
@ -62,4 +65,16 @@ class Settings
return $this;
}
public function getZarinpalMerchant(): ?string
{
return $this->zarinpalMerchant;
}
public function setZarinpalMerchant(?string $zarinpalMerchant): static
{
$this->zarinpalMerchant = $zarinpalMerchant;
return $this;
}
}

View file

@ -0,0 +1,66 @@
<?php
namespace App\Entity;
use App\Repository\StatmentRepository;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity(repositoryClass: StatmentRepository::class)]
class Statment
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 255, nullable: true)]
private ?string $title = null;
#[ORM\Column(type: Types::TEXT)]
private ?string $body = null;
#[ORM\Column(length: 255)]
private ?string $dateSubmit = null;
public function getId(): ?int
{
return $this->id;
}
public function getTitle(): ?string
{
return $this->title;
}
public function setTitle(?string $title): static
{
$this->title = $title;
return $this;
}
public function getBody(): ?string
{
return $this->body;
}
public function setBody(string $body): static
{
$this->body = $body;
return $this;
}
public function getDateSubmit(): ?string
{
return $this->dateSubmit;
}
public function setDateSubmit(string $dateSubmit): static
{
$this->dateSubmit = $dateSubmit;
return $this;
}
}

View file

@ -86,6 +86,9 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
#[ORM\OneToMany(mappedBy: 'submitter', targetEntity: SMSPays::class, orphanRemoval: true)]
private Collection $sMSPays;
#[ORM\OneToMany(mappedBy: 'submitter', targetEntity: WalletTransaction::class)]
private Collection $walletTransactions;
public function __construct()
{
$this->userTokens = new ArrayCollection();
@ -101,6 +104,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
$this->notifications = new ArrayCollection();
$this->emailHistories = new ArrayCollection();
$this->sMSPays = new ArrayCollection();
$this->walletTransactions = new ArrayCollection();
}
public function getId(): ?int
@ -634,4 +638,34 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
return $this;
}
/**
* @return Collection<int, WalletTransaction>
*/
public function getWalletTransactions(): Collection
{
return $this->walletTransactions;
}
public function addWalletTransaction(WalletTransaction $walletTransaction): static
{
if (!$this->walletTransactions->contains($walletTransaction)) {
$this->walletTransactions->add($walletTransaction);
$walletTransaction->setSubmitter($this);
}
return $this;
}
public function removeWalletTransaction(WalletTransaction $walletTransaction): static
{
if ($this->walletTransactions->removeElement($walletTransaction)) {
// set the owning side to null (unless already changed)
if ($walletTransaction->getSubmitter() === $this) {
$walletTransaction->setSubmitter(null);
}
}
return $this;
}
}

View file

@ -0,0 +1,246 @@
<?php
namespace App\Entity;
use App\Repository\WalletTransactionRepository;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity(repositoryClass: WalletTransactionRepository::class)]
class WalletTransaction
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\ManyToOne(inversedBy: 'walletTransactions')]
#[ORM\JoinColumn(nullable: false)]
private ?Business $bid = null;
#[ORM\Column(length: 255)]
private ?string $dateSubmit = null;
#[ORM\ManyToOne(inversedBy: 'walletTransactions')]
private ?User $submitter = null;
#[ORM\Column(length: 255)]
private ?string $type = null;
#[ORM\Column(length: 255)]
private ?string $amount = null;
#[ORM\Column(length: 255, nullable: true)]
private ?string $shaba = null;
#[ORM\Column(length: 255, nullable: true)]
private ?string $bank = null;
#[ORM\Column(length: 255, nullable: true)]
private ?string $cardNum = null;
#[ORM\Column(length: 255, nullable: true)]
private ?string $status = null;
#[ORM\Column(length: 255, nullable: true)]
private ?string $des = null;
#[ORM\Column(length: 255, nullable: true)]
private ?string $cardPan = null;
#[ORM\Column(length: 255, nullable: true)]
private ?string $refID = null;
#[ORM\Column(length: 255, nullable: true)]
private ?string $verifyCode = null;
#[ORM\Column(length: 255, nullable: true)]
private ?string $gatePay = null;
#[ORM\Column(length: 255, nullable: true)]
private ?string $transactionID = null;
public function getId(): ?int
{
return $this->id;
}
public function getBid(): ?Business
{
return $this->bid;
}
public function setBid(?Business $bid): static
{
$this->bid = $bid;
return $this;
}
public function getDateSubmit(): ?string
{
return $this->dateSubmit;
}
public function setDateSubmit(string $dateSubmit): static
{
$this->dateSubmit = $dateSubmit;
return $this;
}
public function getSubmitter(): ?User
{
return $this->submitter;
}
public function setSubmitter(?User $submitter): static
{
$this->submitter = $submitter;
return $this;
}
public function getType(): ?string
{
return $this->type;
}
public function setType(string $type): static
{
$this->type = $type;
return $this;
}
public function getAmount(): ?string
{
return $this->amount;
}
public function setAmount(string $amount): static
{
$this->amount = $amount;
return $this;
}
public function getShaba(): ?string
{
return $this->shaba;
}
public function setShaba(?string $shaba): static
{
$this->shaba = $shaba;
return $this;
}
public function getBank(): ?string
{
return $this->bank;
}
public function setBank(?string $bank): static
{
$this->bank = $bank;
return $this;
}
public function getCardNum(): ?string
{
return $this->cardNum;
}
public function setCardNum(?string $cardNum): static
{
$this->cardNum = $cardNum;
return $this;
}
public function getStatus(): ?string
{
return $this->status;
}
public function setStatus(?string $status): static
{
$this->status = $status;
return $this;
}
public function getDes(): ?string
{
return $this->des;
}
public function setDes(?string $des): static
{
$this->des = $des;
return $this;
}
public function getCardPan(): ?string
{
return $this->cardPan;
}
public function setCardPan(?string $cardPan): static
{
$this->cardPan = $cardPan;
return $this;
}
public function getRefID(): ?string
{
return $this->refID;
}
public function setRefID(?string $refID): static
{
$this->refID = $refID;
return $this;
}
public function getVerifyCode(): ?string
{
return $this->verifyCode;
}
public function setVerifyCode(?string $verifyCode): static
{
$this->verifyCode = $verifyCode;
return $this;
}
public function getGatePay(): ?string
{
return $this->gatePay;
}
public function setGatePay(?string $gatePay): static
{
$this->gatePay = $gatePay;
return $this;
}
public function getTransactionID(): ?string
{
return $this->transactionID;
}
public function setTransactionID(?string $transactionID): static
{
$this->transactionID = $transactionID;
return $this;
}
}

View file

@ -0,0 +1,95 @@
<?php
namespace App\Module;
class RemoteAddress
{
/**
* Whether to use proxy addresses or not.
*
* As default this setting is disabled - IP address is mostly needed to increase
* security. HTTP_* are not reliable since can easily be spoofed. It can be enabled
* just for more flexibility, but if user uses proxy to connect to trusted services
* it's his/her own risk, only reliable field for IP address is $_SERVER['REMOTE_ADDR'].
*
* @var bool
*/
protected $useProxy = false;
/**
* List of trusted proxy IP addresses
*
* @var array
*/
protected $trustedProxies = array();
/**
* HTTP header to introspect for proxies
*
* @var string
*/
protected $proxyHeader = 'HTTP_X_FORWARDED_FOR';
// [...]
/**
* Returns client IP address.
*
* @return string IP address.
*/
public function getIpAddress()
{
$ip = $this->getIpAddressFromProxy();
if ($ip) {
return $ip;
}
// direct IP address
if (isset($_SERVER['REMOTE_ADDR'])) {
return $_SERVER['REMOTE_ADDR'];
}
return '';
}
/**
* Attempt to get the IP address for a proxied client
*
* @see http://tools.ietf.org/html/draft-ietf-appsawg-http-forwarded-10#section-5.2
* @return false|string
*/
protected function getIpAddressFromProxy()
{
if (!$this->useProxy
|| (isset($_SERVER['REMOTE_ADDR']) && !in_array($_SERVER['REMOTE_ADDR'], $this->trustedProxies))
) {
return false;
}
$header = $this->proxyHeader;
if (!isset($_SERVER[$header]) || empty($_SERVER[$header])) {
return false;
}
// Extract IPs
$ips = explode(',', $_SERVER[$header]);
// trim, so we can compare against trusted proxies properly
$ips = array_map('trim', $ips);
// remove trusted proxy IPs
$ips = array_diff($ips, $this->trustedProxies);
// Any left?
if (empty($ips)) {
return false;
}
// Since we've removed any known, trusted proxy servers, the right-most
// address represents the first IP we do not know about -- i.e., we do
// not know if it is a proxy server, or a client. As such, we treat it
// as the originating IP.
// @see http://en.wikipedia.org/wiki/X-Forwarded-For
return array_pop($ips);
}
// [...]
}

View file

@ -0,0 +1,48 @@
<?php
namespace App\Repository;
use App\Entity\PayInfoTemp;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
/**
* @extends ServiceEntityRepository<PayInfoTemp>
*
* @method PayInfoTemp|null find($id, $lockMode = null, $lockVersion = null)
* @method PayInfoTemp|null findOneBy(array $criteria, array $orderBy = null)
* @method PayInfoTemp[] findAll()
* @method PayInfoTemp[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class PayInfoTempRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, PayInfoTemp::class);
}
// /**
// * @return PayInfoTemp[] Returns an array of PayInfoTemp objects
// */
// public function findByExampleField($value): array
// {
// return $this->createQueryBuilder('p')
// ->andWhere('p.exampleField = :val')
// ->setParameter('val', $value)
// ->orderBy('p.id', 'ASC')
// ->setMaxResults(10)
// ->getQuery()
// ->getResult()
// ;
// }
// public function findOneBySomeField($value): ?PayInfoTemp
// {
// return $this->createQueryBuilder('p')
// ->andWhere('p.exampleField = :val')
// ->setParameter('val', $value)
// ->getQuery()
// ->getOneOrNullResult()
// ;
// }
}

View file

@ -0,0 +1,48 @@
<?php
namespace App\Repository;
use App\Entity\Statment;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
/**
* @extends ServiceEntityRepository<Statment>
*
* @method Statment|null find($id, $lockMode = null, $lockVersion = null)
* @method Statment|null findOneBy(array $criteria, array $orderBy = null)
* @method Statment[] findAll()
* @method Statment[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class StatmentRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Statment::class);
}
// /**
// * @return Statment[] Returns an array of Statment objects
// */
// public function findByExampleField($value): array
// {
// return $this->createQueryBuilder('s')
// ->andWhere('s.exampleField = :val')
// ->setParameter('val', $value)
// ->orderBy('s.id', 'ASC')
// ->setMaxResults(10)
// ->getQuery()
// ->getResult()
// ;
// }
// public function findOneBySomeField($value): ?Statment
// {
// return $this->createQueryBuilder('s')
// ->andWhere('s.exampleField = :val')
// ->setParameter('val', $value)
// ->getQuery()
// ->getOneOrNullResult()
// ;
// }
}

View file

@ -0,0 +1,48 @@
<?php
namespace App\Repository;
use App\Entity\WalletTransaction;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
/**
* @extends ServiceEntityRepository<WalletTransaction>
*
* @method WalletTransaction|null find($id, $lockMode = null, $lockVersion = null)
* @method WalletTransaction|null findOneBy(array $criteria, array $orderBy = null)
* @method WalletTransaction[] findAll()
* @method WalletTransaction[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class WalletTransactionRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, WalletTransaction::class);
}
// /**
// * @return WalletTransaction[] Returns an array of WalletTransaction objects
// */
// public function findByExampleField($value): array
// {
// return $this->createQueryBuilder('w')
// ->andWhere('w.exampleField = :val')
// ->setParameter('val', $value)
// ->orderBy('w.id', 'ASC')
// ->setMaxResults(10)
// ->getQuery()
// ->getResult()
// ;
// }
// public function findOneBySomeField($value): ?WalletTransaction
// {
// return $this->createQueryBuilder('w')
// ->andWhere('w.exampleField = :val')
// ->setParameter('val', $value)
// ->getQuery()
// ->getOneOrNullResult()
// ;
// }
}

View file

@ -3,16 +3,18 @@
namespace App\Service;
use App\Entity\Business;
use App\Module\RemoteAddress;
use Doctrine\ORM\EntityManagerInterface;
class Log
{
private $em;
private $remoteAddress;
function __construct(EntityManagerInterface $entityManager)
{
$this->em = $entityManager;
$this->remoteAddress = new RemoteAddress();
}
public function insert($part,$des, $user = null, $bid = null): void
@ -25,6 +27,7 @@ class Log
$log->setDes($des);
$log->setUser($user);
$log->setBid($bid);
$log->setIpaddress($this->remoteAddress->getIpAddress());
$this->em->persist($log);
$this->em->flush();
}

View file

@ -1,6 +1,8 @@
<?php
namespace App\Service;
use App\Entity\Business;
use App\Entity\Settings;
use App\Entity\User;
use Melipayamak\MelipayamakApi;
use Doctrine\ORM\EntityManagerInterface;
@ -8,6 +10,9 @@ class SMS
{
private EntityManagerInterface $entityManager;
private Settings $settings;
private int $smsPrice = 2500;
/**
* @param EntityManagerInterface $entityManager
*/
@ -17,7 +22,8 @@ class SMS
$this->settings = $entityManager->getRepository(Settings::class)->findAll()[0];
}
public function send(array $params,$bodyID,$to){
public function send(array $params,$bodyID,$to): void
{
try{
$username = $this->settings->getPayamakUsername();
$password = $this->settings->getPayamakPassword();
@ -29,6 +35,26 @@ class SMS
}catch(\Exception $e){
//echo $e->getMessage();
}
}
}
public function sendByBalance(array $params,$bodyID,$to,Business $business,User $user,$balance = 450): int
{
if($business->getSmsCharge() < ($balance * $this->smsPrice))
return 2;
$this->send($params,$bodyID,$to);
$business->setSmsCharge($business->getSmsCharge() - ($balance * $this->smsPrice));
$this->entityManager->persist($business);
$this->entityManager->flush();
//save logs
$log = new \App\Entity\Log();
$log->setBid($business);
$log->setDateSubmit(time());
$log->setPart('پیامک');
$log->setUser($user);
$log->setDes('ارسال پیامک به طول ' . $balance . ' پیامک به شماره ' . $to . ' با شماره الگو ' . $bodyID . ' هزینه: ' . ($this->smsPrice * $balance) . ' ریال ');
$this->entityManager->persist($log);
$this->entityManager->flush();
return 1;
}
}

View file

@ -4,8 +4,21 @@
namespace App\Service;
use App\Entity\ChangeReport;
use Doctrine\ORM\EntityManagerInterface;
class twigFunctions
{
private EntityManagerInterface $em;
/**
* @param EntityManagerInterface $em
*/
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
public function md5($val){
return md5($val);
@ -64,5 +77,12 @@ class twigFunctions
}
}
public function getHesabixLastVersionNumber():string{
$last = $this->em->getRepository(ChangeReport::class)->findOneBy([],['id'=>'DESC']);
if($last)
return $last->getVersion();
return '0.0.1';
}
}

View file

@ -240,20 +240,6 @@
"./config/packages/security.yaml"
]
},
"symfony/stimulus-bundle": {
"version": "2.10",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "2.9",
"ref": "05c45071c7ecacc1e48f94bc43c1f8d4405fb2b2"
},
"files": [
"./assets/bootstrap.js",
"./assets/controllers.json",
"./assets/controllers/hello_controller.js"
]
},
"symfony/translation": {
"version": "6.2",
"recipe": {
@ -280,18 +266,6 @@
"./templates/base.html.twig"
]
},
"symfony/ux-vue": {
"version": "2.10",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "2.9",
"ref": "7a6b5e211acc7b10b7190e704b40f6d2bca01adf"
},
"files": [
"./assets/vue/controllers/Hello.vue"
]
},
"symfony/validator": {
"version": "6.2",
"recipe": {
@ -317,22 +291,6 @@
"./config/routes/web_profiler.yaml"
]
},
"symfony/webpack-encore-bundle": {
"version": "2.0",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "2.0",
"ref": "082d754b3bd54b3fc669f278f1eea955cfd23cf5"
},
"files": [
"./assets/app.js",
"./assets/styles/app.css",
"./config/packages/webpack_encore.yaml",
"./package.json",
"./webpack.config.js"
]
},
"symfonycasts/verify-email-bundle": {
"version": "v1.13.0"
},

View file

@ -10,11 +10,9 @@
<title>حسابیکس - {% block title %}{% endblock %}</title>
{# Run `composer require symfony/webpack-encore-bundle` to start using Symfony UX #}
{% block stylesheets %}
{{ encore_entry_link_tags('app') }}
{% endblock %}
{% block javascripts %}
{{ encore_entry_script_tags('app') }}
{% endblock %}
<!-- Icons -->
<link rel="icon" href="{{ asset('/favicon.ico') }}">
@ -253,7 +251,7 @@
متن باز است.
</div>
<div class="col-sm-6 order-sm-1 text-center text-sm-start">
<a class="fw-semibold" href="https://github.com/morrning/hesabixUI" target="_blank">Hesabix v 0.2.1</a> © <span>1402</span>
<a class="fw-semibold" href="https://github.com/morrning/hesabixUI" target="_blank">حسابیکس : {{ twigFunctions.getHesabixLastVersionNumber() }}</a>
</div>
</div>
</div>

View file

@ -16,10 +16,10 @@
<i class="fa fa-door-open"></i>
ورود | عضویت رایگان
</a>
<a href="http://insider.hesabix.ir" class="btn btn-outline-warning btn-lg px-4 gap-3">
<button href="http://insider.hesabix.ir" disabled="disabled" class="btn btn-outline-warning btn-lg px-4 gap-3">
<i class="fa fa-door-open"></i>
دمو (نسخه در حال توسعه)
</a>
پیش‌نمایش (فعلا غیرفعال است)
</button>
{% if is_granted('ROLE_ADMIN')%}
<a href="/app/dashboard" class="btn btn-alt-danger btn-lg px-4 gap-3">
<i class="fa fa-door-open"></i>
@ -85,58 +85,70 @@
</div>
<div class="container">
<div class="row">
<div class="col-sm-12 col-md-8">
<div class="block block-rounded row g-0 bg-info">
<ul class="nav nav-tabs nav-tabs-block flex-md-column col-md-4" role="tablist">
<li class="nav-item d-md-flex flex-md-column" role="presentation">
<button aria-controls="btabs-vertical-home" aria-selected="false" class="nav-link text-md-start" data-bs-target="#btabs-vertical-home" data-bs-toggle="tab" id="btabs-vertical-home-tab" role="tab" tabindex="1">
<i class="fa fa-fw fa-dot-circle opacity-50 me-1 d-none d-sm-inline-block"></i>حسابیکس چیست</button>
</li>
<li class="nav-item d-md-flex flex-md-column" role="presentation">
<button aria-controls="btabs-vertical-profile" aria-selected="false" class="nav-link text-md-start" data-bs-target="#btabs-vertical-profile" data-bs-toggle="tab" id="btabs-vertical-profile-tab" role="tab" tabindex="2">
<i class="fa fa-fw fa-dot-circle opacity-50 me-1 d-none d-sm-inline-block"></i>ساده و قدرتمند</button>
</li>
<li class="nav-item d-md-flex flex-md-column" role="presentation">
<button aria-controls="btabs-vertical-settings" aria-selected="true" class="nav-link text-md-start active" data-bs-target="#btabs-vertical-settings" data-bs-toggle="tab" id="btabs-vertical-settings-tab" role="tab" tabindex="3">
<i class="fa fa-fw fa-dot-circle opacity-50 me-1 d-none d-sm-inline-block"></i>سریع و بروز</button>
</li>
</ul>
<div class="tab-content col-md-8">
<div aria-labelledby="btabs-vertical-home-tab" class="block-content tab-pane" id="btabs-vertical-home" role="tabpanel" tabindex="1">
<h4 class="fw-semibold text-light">حسابیکس چیست</h4>
<p class="fs-sm"> حسابیکس اولین نرم افزار کامل حسابداری تحت وب است. این نرم افزار بر اساس فناوری رایانش ابری ساخته شده است. یعنی کلیه اطلاعات شما بر روی سرورهای حسابیکس قرار می گیرد. ما امنیت اطلاعات و حریم خصوصی کلیه کاربران را به طور کامل تضمین می کنیم.
برای کار با حسابیکس فقط به یک دستگاه متصل به اینترنت نیاز دارید، فرقی نمی کند که این دستگاه تبلت یا موبایل باشد یا اینکه رایانه و لپ تاپ.
نیاز نیست که هیچگونه نرم افزاری را نصب کنید. کافیست در سایت ثبت نام کرده و بلافاصله کسب و کار خود را مدیریت کنید. </p>
<div class="col-sm-12 col-md-6 mb-2">
<div class="col-12 mb-2">
<div class="card">
<div class="card-body">
<h5 class="card-title text-primary-dark">حسابیکس چیست؟</h5>
<p class="card-text">
حسابیکس اولین نرم افزار کامل حسابداری تحت وب است. این نرم افزار بر اساس فناوری رایانش ابری ساخته شده است. یعنی کلیه اطلاعات شما بر روی سرورهای حسابیکس قرار می گیرد. ما امنیت اطلاعات و حریم خصوصی کلیه کاربران را به طور کامل تضمین می کنیم. برای کار با حسابیکس فقط به یک دستگاه متصل به اینترنت نیاز دارید، فرقی نمی کند که این دستگاه تبلت یا موبایل باشد یا اینکه رایانه و لپ تاپ. نیاز نیست که هیچگونه نرم افزاری را نصب کنید. کافیست در سایت ثبت نام کرده و بلافاصله کسب و کار خود را مدیریت کنید.
</p>
</div>
<div aria-labelledby="btabs-vertical-profile-tab" class="block-content tab-pane" id="btabs-vertical-profile" role="tabpanel" tabindex="2">
<h4 class="fw-semibold text-light">حسابیکس ساده و قدرتمند</h4>
<p class="fs-sm">بدون نیاز به دانش حسابداری می توانید از حسابیکس استفاده کنید. سعی کرده ایم محیط نرم افزار را ساده و کاربرپسند طراحی کنیم. پیچیدگی های معمول نرم افزارهای حسابداری را حذف کرده ایم و تلاش کرده ایم که عملیات های پیچیده حسابداری را به صورت اتوماتیک توسط نرم افزار انجام دهیم.
با این حال، بر روی قدرتمندی و امکانات نرم افزاری نیز تمرکز ویژه ای داشته ایم. ما به عنوان شرکت پیشرو در زمینه حسابداری ابری، امکانات و قابلیت های منحصر به فردی را به کاربران ارائه می دهیم.</p>
</div>
<div aria-labelledby="btabs-vertical-settings-tab" class="block-content tab-pane active show" id="btabs-vertical-settings" role="tabpanel" tabindex="3">
<h4 class="fw-semibold text-light">حسابیکس سریع و بروز</h4>
<p class="fs-sm">با وجود اینکه حسابیکس بر روی بستر اینترنت ارائه می شود، این نرم افزار بسیار سریع است. تجربه کاربری ارائه شده در حسابیکس نه تنها از لحاظ سرعت با نرم افزارهای تحت ویندوز رقابت می کند بلکه در بسیاری از موارد عملیات را سریعتر انجام می دهد.
به علاوه حسابیکس همیشه بروز است. هر زمان که به سیستم وارد می شوید، آخرین نسخه از نرم افزار در دسترس شما قرار می گیرد.
تیم فنی حسابیکس به طور مرتب در حال بروز رسانی و ایجاد امکانات و قابلیت های جدید در نرم افزار است. این امکانات به رایگان در اختیار کلیه کاربران قرار می گیرد.</p>
</div>
</div>
<div class="col-12 mb-2">
<div class="card">
<div class="card-body">
<h5 class="card-title text-primary-dark">ساده و قدرتمند</h5>
<p class="card-text">
برای کار با حسابیکس فقط به یک دستگاه متصل به اینترنت نیاز دارید، مهم نیست که این دستگاه تبلت یا موبایل باشد یا اینکه رایانه و لپ تاپ.
نیاز نیست که هیچگونه نرم افزاری را نصب کنید. کافیست در سایت ثبت نام کرده و بلافاصله کسب و کار خود را مدیریت کنید.
</p>
</div>
</div>
</div>
</div>
<div class="col-sm-12 col-md-4 text-light px-0">
<div class="col-sm-12 col-md-6 mb-2">
<div class="row">
<div class="col-12 mb-2">
<div class="card">
<div class="card-body">
<h5 class="card-title text-primary-dark">نقاط قوت و تمایز</h5>
<p class="card-text">
در حسابیکس می توانید فاکتورهای مشتریان را به صورت آنلاین برای آنها ارسال کنید، مشتری نیز می تواند فاکتور یا حتی مانده بدهی خود را به صورت آنلاین پرداخت کند. کلیه اسناد مربوطه نیز توسط نرم افزار به صورت اتوماتیک صادر می شوند. از سوی دیگر ذینفعان کسب و کار شما، مانند مشتریان یا تامین کنندگان، می توانند به صورت آنلاین و بروز، کارت حساب خود را مشاهده کنند.</p>
</div>
</div>
</div>
<div class="col-12 mb-2">
<div class="card">
<div class="card-body">
<h5 class="card-title text-primary-dark">سریع و به روز</h5>
<p class="card-text">
با وجود اینکه حسابیکس بر روی بستر اینترنت ارائه می شود، این نرم افزار بسیار سریع است. تجربه کاربری ارائه شده در حسابیکس نه تنها از لحاظ سرعت با نرم افزارهای تحت ویندوز رقابت می کند بلکه در بسیاری از موارد عملیات را سریعتر انجام می دهد. به علاوه حسابیکس همیشه بروز است. هر زمان که به سیستم وارد می شوید، آخرین نسخه از نرم افزار در دسترس شما قرار می گیرد. این امکانات به رایگان در اختیار کلیه کاربران قرار می گیرد. </p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-sm-12 col-md-12">
<div class="block block-rounded block-transparent">
<div class="bg-image">
<div class="block-content block-content-full bg-secondary rounded-2">
<div class="block-content block-content-full bg-white rounded-2">
<div class="row px-0 justify-content-sm-between align-items-center">
<div class="col-sm-12">
<h4 class="mb-2">
<h4 class="mb-2 text-primary-dark">
<i class="fa fa-user-plus"></i>
جدیدترین عضو حسابیکس...
</h4>
<p class=" mb-sm-0">
به جدیدترین عضو حسابیکس
<span class="text-primary-lighter">{{ lastBusinessOwner }}</span>
<span class="text-primary">{{ lastBusinessOwner }}</span>
که کسب‌و‌کار خود را با نام
<span class="text-primary-lighter">{{ lastBusinessName }}</span>
<span class="text-primary">{{ lastBusinessName }}</span>
ایجاد کرده‌اند خوش‌آمد می‌گوییم.
</p>
</div>
@ -147,8 +159,8 @@
</div>
</div>
</div>
<div class="content content-boxed">
<h3>آخرین مطالب وبلاگ</h3>
<div class="content content-boxed mt-0 pt-0">
<h3>وبلاگ حسابیکس</h3>
<div class="row items-push">
{% for item in blogPosts %}
<div class="col-sm-12 col-md-4">

View file

@ -0,0 +1,36 @@
{% extends 'blank.html.twig' %}
{% block title %}خطا در پرداخت{% endblock %}
{% block body %}
<div class="container">
<div class="row justify-content-center text-center">
<div class="album p-5 m-5 col-sm-12 col-md-7">
<div class="block">
<div class="block-header block-header-default">
<div class="block-title text-primary-dark text-start">
<img src="{{ asset('/img/logo-blue.png') }}" class="img-avatar img-avatar32" alt="حسابیکس"/>
حسابیکس
</div>
</div>
<div class="block-content p-3">
<h2 class="text-danger">خطا در پردازش پرداخت</h2>
<h5 class="mx-5">
متاسفانه پردازش پرداخت ناموفق بود! به نظر می‌رسد خطای سیستمی رخ داده باشد.
</h5>
<a class="btn btn-lg btn-success mt-4" href="{{ path('shortlinks_show',{'type':type,'bid':doc.bid.id,'link':doc.id}) }}">
<i class="bi bi-backward"></i>
بازگشت به فاکتور
</a>
<a class="btn btn-lg btn-primary mt-4" href="/">
<i class="bi bi-backward"></i>
صفحه نخست
</a>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View file

@ -0,0 +1,240 @@
{% extends 'blank.html.twig' %}
{% block title %}مشاهده فاکتور فروش
{% endblock %}
{% block body %}
<main
id="main-container">
<!-- Hero -->
<div class="bg-body-light d-print-none">
<div class="content content-full">
<div class="d-flex flex-column flex-sm-row justify-content-sm-between align-items-sm-center">
<h2 class="flex-grow-1 fs-3 fw-semibold my-2 my-sm-3">
مشاهده فاکتور
</h2>
<a class="btn btn-alt-primary my-2" href="https://hesabix.ir">
<i class="fa fa-fw fa-door-open me-1"></i>
ورود به حسابیکس
</a>
</div>
</div>
</div>
<!-- END Hero -->
<!-- Page Content -->
<div
class="content content-boxed">
<!-- Invoice -->
<div class="block block-rounded">
<div class="block-header block-header-default">
<h3 class="block-title">
شماره فاکتور:
<span class="text-primary">
{{doc.code}}
</span>
</h3>
<div class="block-options">
<!-- Print Page functionality is initialized dmPrint() -->
<button class="btn btn-sm btn-alt-secondary me-3" onclick="Dashmix.helpers('dm-print');" type="button">
<i class="si si-printer me-1"></i>
چاپ فاکتور
</button>
{% if (totalPays < doc.amount) and bid.walletEnable %}
<a href="{{ path('pay_sell',{'id':doc.id}) }}" class="btn btn-sm btn-success">
<i class="fa fa-credit-card"></i>
پرداخت آنلاین مبلغ
{{ (doc.amount - totalPays) | number_format }}
ریال
</a>
{% endif %}
</div>
</div>
<div class="block-content">
{% if msg == 'success' %}
<div class="alert alert-success alert-dismissible" role="alert">
<h3 class="alert-heading fs-4 my-2">
<i class="fa fa-check"></i>
نتیجه پرداخت آنلاین</h3>
<button aria-label="Close" class="btn-close" data-bs-dismiss="alert" type="button"></button>
<p class="mb-0">پرداخت فاکتور با موفقیت انجام شد. هم‌اکنون می‌توانید شماره پیگیری را از بخش پرداخت‌ها مشاهده نمایید</p>
</div>
{% elseif msg == 'fail' %}
<div class="alert alert-danger alert-dismissible" role="alert">
<h3 class="alert-heading fs-4 my-2">
<i class="fa fa-close"></i>
نتیجه پرداخت آنلاین</h3>
<button aria-label="Close" class="btn-close" data-bs-dismiss="alert" type="button"></button>
<p class="mb-0">پرداخت فاکتور ناموفق بود. برای پرداخت مجدد می‌توانید دوباره سعی نمایید.</p>
</div>
{% endif %}
<div class="p-sm-2 p-xl-1">
<!-- Invoice Info -->
<div
class="row mb-5">
<!-- Company Info -->
<div class="col-6">
<p class="h3">
{{bid.type}}
:
{{bid.name}}
</p>
<address>آدرس :
استان
{{bid.ostan}}
شهرستان
{{bid.shahrestan}}
{{bid.address}}
</address>
<div>
کد پستی:
{{bid.postalcode}}
</div>
<div>
تلفن :
{{bid.tel}}
</div>
<div>
موبایل :
{{bid.mobile}}
</div>
</div>
<!-- END Company Info -->
<!-- Client Info -->
<div class="col-6 text-end">
<p class="h3">مشتری:
{{ person.nikename }}
</p>
<address>آدرس :
استان
{{person.ostan}}
شهرستان
{{person.shahr}}
{{person.address}}
</address>
<div>
کد پستی:
{{person.postalcode}}
</div>
<div>
تلفن :
{{person.tel}}
</div>
<div>
موبایل :
{{person.mobile}}
</div>
</div>
<!-- END Client Info -->
</div>
<!-- END Invoice Info -->
<!-- Table -->
<div class="table-responsive push text-center">
<table class="table table-bordered">
<thead class="bg-body">
<tr>
<th class="text-center" style="width: 60px;"></th>
<th>کالا/خدمات</th>
<th>شرح</th>
<th class="text-center" style="width: 90px;">واحد</th>
<th class="text-center" style="width: 120px;">تعداد</th>
<th class="text-center" style="width: 120px;">جمع</th>
</tr>
</thead>
<tbody>
{% for row in rows %}
<tr>
<td class="text-center">{{loop.index}}</td>
<td class="text-center">
<p class="fw-semibold">{{ row.commodity.name }}</p>
</td>
<td class="text-center">
<div class="">{{ row.des }}</div>
</td>
<td class="text-center">
{{row.commdityCount}}
</td>
<td class="text-center">{{(row.bs / row.commdityCount) | number_format}}</td>
<td class="text-center">{{row.bs | number_format}}</td>
</tr>
{% endfor %}
<tr>
<td class="fw-bold text-uppercase text-end bg-body-light" colspan="5">جمع کل</td>
<td class="fw-bold text-end bg-body-light">{{doc.amount | number_format}}</td>
</tr>
</tbody>
</table>
</div>
<!-- END Table -->
<div class="block block-rounded">
<div class="block-header block-header-default">
<h3 class="block-title">سوابق پرداخت‌ها</h3>
<div class="block-options">
<div class="block-options-item">
وضعیت پرداخت‌ها:
{% if totalPays < doc.amount %}
<b class="text-danger">تسویه نشده</b>
{% else %}
<b class="text-success">تسویه شده</b>
{% endif %}
</div>
</div>
</div>
<div class="block-content p-0">
<div class="table-responsive push text-center">
<table class="table table-bordered">
<thead class="bg-body">
<tr>
<th class="text-center" style="width: 60px;">ردیف</th>
<th>روش پرداخت</th>
<th>تاریخ</th>
<th class="text-center">مبلغ</th>
<th class="text-center">شماره پیگیری/سند</th>
<th class="text-center">توضیحات</th>
</tr>
</thead>
<tbody>
{% for item in doc.relatedDocs %}
<tr>
<td>{{ loop.index }}</td>
{% if item.type == 'walletPay' %}
<td class="text-success"><i class="fa fa-wallet"></i>پرداخت آنلاین</td>
{% else %}
<td class="text-primary"><i class="fa fa-file"></i>سند حسابداری</td>
{% endif %}
<td>{{ item.date}}</td>
<td>{{ item.amount | number_format }}</td>
<td>{{ item.code }}</td>
<td>{{ item.des }}</td>
</tr>
{% endfor %}
<tr class="">
<td class="fw-bold text-uppercase text-end bg-body-light" colspan="5">جمع کل</td>
<td class="fw-bold text-end bg-body-light">{{ totalPays | number_format }}
ریال
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<!-- Footer -->
<a href="https://hesabix.ir" class="p-4 mb-3text-primary text-center my-5">
حسابیکس
<label class="text-muted">سامانه جامع مالی رایگان ، ابری و متن باز</label>
</a>
<!-- END Footer -->
</div>
</div>
</div>
<!-- END Invoice -->
</div>
<!-- END Page Content -->
</main>
{% endblock %}

View file

@ -1,79 +0,0 @@
const Encore = require('@symfony/webpack-encore');
// Manually configure the runtime environment if not already configured yet by the "encore" command.
// It's useful when you use tools that rely on webpack.config.js file.
if (!Encore.isRuntimeEnvironmentConfigured()) {
Encore.configureRuntimeEnvironment(process.env.NODE_ENV || 'dev');
}
Encore
// directory where compiled assets will be stored
.setOutputPath('../public_html/build/')
// public path used by the web server to access the output path
.setPublicPath('/build')
// only needed for CDN's or subdirectory deploy
//.setManifestKeyPrefix('build/')
/*
* ENTRY CONFIG
*
* Each entry will result in one JavaScript file (e.g. app.js)
* and one CSS file (e.g. app.css) if your JavaScript imports CSS.
*/
.addEntry('app', './assets/app.js')
// enables the Symfony UX Stimulus bridge (used in assets/bootstrap.js)
.enableStimulusBridge('./assets/controllers.json')
// When enabled, Webpack "splits" your files into smaller pieces for greater optimization.
.splitEntryChunks()
.enableVueLoader()
// will require an extra script tag for runtime.js
// but, you probably want this, unless you're building a single-page app
.enableSingleRuntimeChunk()
/*
* FEATURE CONFIG
*
* Enable & configure other features below. For a full
* list of features, see:
* https://symfony.com/doc/current/frontend.html#adding-more-features
*/
.cleanupOutputBeforeBuild()
.enableBuildNotifications()
.enableSourceMaps(!Encore.isProduction())
// enables hashed filenames (e.g. app.abc123.css)
.enableVersioning(Encore.isProduction())
// configure Babel
// .configureBabel((config) => {
// config.plugins.push('@babel/a-babel-plugin');
// })
// enables and configure @babel/preset-env polyfills
.configureBabelPresetEnv((config) => {
config.useBuiltIns = 'usage';
config.corejs = '3.23';
})
// enables Sass/SCSS support
//.enableSassLoader()
// uncomment if you use TypeScript
//.enableTypeScriptLoader()
// uncomment if you use React
//.enableReactPreset()
// uncomment to get integrity="..." attributes on your script & link tags
// requires WebpackEncoreBundle 1.4 or higher
//.enableIntegrityHashes(Encore.isProduction())
// uncomment if you're having problems with a jQuery plugin
//.autoProvidejQuery()
.enableVueLoader(() => {}, { runtimeCompilerBuild: false })
;
module.exports = Encore.getWebpackConfig();

View file

@ -1 +0,0 @@
.*/**

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,82 +0,0 @@
CKEditor 4 - Releases
=====================
## Releases Code
This repository contains the official release versions of [CKEditor 4](https://ckeditor.com/ckeditor-4/).
There are four versions for each release &mdash; `standard-all`, `basic`, `standard`, and `full`.
They differ in the number of plugins that are compiled into the main `ckeditor.js` file as well as the toolbar configuration.
See the [comparison](https://ckeditor.com/cke4/presets) of the `basic`, `standard`, and `full` installation presets for more details.
The `standard-all` build includes all official CKSource plugins with only those from the `standard` installation preset compiled into the `ckeditor.js` file and enabled in the configuration.
All versions available in this repository were built using [CKBuilder](https://ckeditor.com/cke4/builder), so they are optimized and ready to be used in a production environment.
## Documentation
Developer documentation for CKEditor is available online at: <https://ckeditor.com/docs/>.
## Installation
### Git clone
To install one of the available releases, just clone this repository and switch to the respective branch (see next section):
git clone -b <release branch> git://github.com/ckeditor/ckeditor4-releases.git
### Git submodule
If you are using git for your project and you want to integrate CKEditor, we recommend to add this repository as a
[submodule](https://git-scm.com/book/en/v2/Git-Tools-Submodules).
git submodule add -b <release branch> git://github.com/ckeditor/ckeditor-releases.git <clone dir>
git commit -m "Added CKEditor submodule in <clone dir> directory."
### Using Package Managers
See the [Installing CKEditor with Package Managers](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_package_managers.html) article for more details about installing CKEditor with [Bower](https://bower.io), [Composer](https://getcomposer.org/) and [npm](https://www.npmjs.com/).
## Repository Structure
### Branches
This repository contains the following branches:
- `master` and `latest` &ndash; the latest release of the `standard-all` preset (including betas).
- `stable` &ndash; the latest stable release of the `standard-all` preset (non-beta).
- `A.B.x` (e.g. `4.3.x`) &ndash; the latest release of the `standard-all` preset in the `A.B` branch.
- `(basic|standard|full)/stable` &ndash; the latest stable release tag point (non-beta).
- `(basic|standard|full)/latest` &ndash; the latest release tag point (including betas).
- `(basic|standard|full)/A.B.x` (e.g. `basic/4.0.x`) &ndash; the latest releases in the `A.B` branch.
### Tags
**Since version 4.3.3** this repository uses the following tag naming rules:
- `x.y.z` &ndash; contains the `standard-all` editor build, e.g. `4.3.3`, `4.4.0` etc.
- `(basic|standard|full)/x.y.z` &ndash; contains the editor build with a given preset, e.g. `basic/4.3.3`.
The version numbers follow the [Semantic Versioning 2.0.0](http://semver.org/) scheme.
Up to version **4.3.2** the tags were released in the following form `x.y[.z]/(basic|standard|full)`.
For example: `4.0/basic`, `4.0.1/standard`. This convention was changed in CKEditor 4.3.3 to conform to the Semantic Versioning scheme.
## Checking Your Installation
The editor comes with a few sample pages that can be used to verify if the installation succeeded. Take a look at the `samples` directory.
To test your installation, just call the following page for your website:
http://<your site>/<CKEditor installation path>/samples/index.html
For example:
http://www.example.com/ckeditor/samples/index.html
### License
Licensed under the GPL, LGPL, and MPL licenses, at your choice.
Please check the `LICENSE.md` file for more information about the license.

View file

@ -1,10 +0,0 @@
# Reporting a security issues
If you believe you have found a security issue in the CKEditor 4 software, please contact us immediately.
When reporting a potential security problem, please bear this in mind:
* Make sure to provide as many details as possible about the vulnerability.
* Please do not disclose publicly any security issues until we fix them and publish security releases.
Contact the security team at security@cksource.com. As soon as we receive the security report, we will work promptly to confirm the issue and then to provide a security fix.

View file

@ -1,10 +0,0 @@
/*
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
CKEditor 4 LTS ("Long Term Support") is available under the terms of the Extended Support Model.
*/
(function(a){if("undefined"==typeof a)throw Error("jQuery should be loaded before CKEditor jQuery adapter.");if("undefined"==typeof CKEDITOR)throw Error("CKEditor should be loaded before CKEditor jQuery adapter.");CKEDITOR.config.jqueryOverrideVal="undefined"==typeof CKEDITOR.config.jqueryOverrideVal?!0:CKEDITOR.config.jqueryOverrideVal;a.extend(a.fn,{ckeditorGet:function(){var a=this.eq(0).data("ckeditorInstance");if(!a)throw"CKEditor is not initialized yet, use ckeditor() with a callback.";return a},
ckeditor:function(g,e){if(!CKEDITOR.env.isCompatible)throw Error("The environment is incompatible.");if("function"!==typeof g){var m=e;e=g;g=m}var k=[];e=e||{};this.each(function(){var b=a(this),c=b.data("ckeditorInstance"),f=b.data("_ckeditorInstanceLock"),h=this,l=new a.Deferred;k.push(l.promise());if(c&&!f)g&&g.apply(c,[this]),l.resolve();else if(f)c.once("instanceReady",function(){setTimeout(function d(){c.element?(c.element.$==h&&g&&g.apply(c,[h]),l.resolve()):setTimeout(d,100)},0)},null,null,
9999);else{if(e.autoUpdateElement||"undefined"==typeof e.autoUpdateElement&&CKEDITOR.config.autoUpdateElement)e.autoUpdateElementJquery=!0;e.autoUpdateElement=!1;b.data("_ckeditorInstanceLock",!0);c=a(this).is("textarea")?CKEDITOR.replace(h,e):CKEDITOR.inline(h,e);b.data("ckeditorInstance",c);c.on("instanceReady",function(e){var d=e.editor;setTimeout(function n(){if(d.element){e.removeListener();d.on("dataReady",function(){b.trigger("dataReady.ckeditor",[d])});d.on("setData",function(a){b.trigger("setData.ckeditor",
[d,a.data])});d.on("getData",function(a){b.trigger("getData.ckeditor",[d,a.data])},999);d.on("destroy",function(){b.trigger("destroy.ckeditor",[d])});d.on("save",function(){a(h.form).trigger("submit");return!1},null,null,20);if(d.config.autoUpdateElementJquery&&b.is("textarea")&&a(h.form).length){var c=function(){b.ckeditor(function(){d.updateElement()})};a(h.form).on("submit",c);a(h.form).on("form-pre-serialize",c);b.on("destroy.ckeditor",function(){a(h.form).off("submit",c);a(h.form).off("form-pre-serialize",
c)})}d.on("destroy",function(){b.removeData("ckeditorInstance")});b.removeData("_ckeditorInstanceLock");b.trigger("instanceReady.ckeditor",[d]);g&&g.apply(d,[h]);l.resolve()}else setTimeout(n,100)},0)},null,null,9999)}});var f=new a.Deferred;this.promise=f.promise();a.when.apply(this,k).then(function(){f.resolve()});this.editor=this.eq(0).data("ckeditorInstance");return this}});CKEDITOR.config.jqueryOverrideVal&&(a.fn.val=CKEDITOR.tools.override(a.fn.val,function(g){return function(e){if(arguments.length){var m=
this,k=[],f=this.each(function(){var b=a(this),c=b.data("ckeditorInstance");if(b.is("textarea")&&c){var f=new a.Deferred;c.setData(e,function(){f.resolve()});k.push(f.promise());return!0}return g.call(b,e)});if(k.length){var b=new a.Deferred;a.when.apply(this,k).done(function(){b.resolveWith(m)});return b.promise()}return f}var f=a(this).eq(0),c=f.data("ckeditorInstance");return f.is("textarea")&&c?c.getData():g.call(f)}}))})(window.jQuery);

View file

@ -1,10 +0,0 @@
{
"name": "ckeditor",
"description": "JavaScript WYSIWYG web text editor.",
"keywords": [ "ckeditor4", "ckeditor", "fckeditor", "editor", "wysiwyg", "html", "richtext", "text", "javascript" ],
"authors": "CKSource (https://cksource.com/)",
"license": "For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license/.",
"homepage": "https://ckeditor.com",
"main": "./ckeditor.js",
"moduleType": "globals"
}

View file

@ -1,195 +0,0 @@
/**
* @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license/
*/
/**
* This file was added automatically by CKEditor builder.
* You may re-use it at any time to build CKEditor again.
*
* If you would like to build CKEditor online again
* (for example to upgrade), visit one the following links:
*
* (1) https://ckeditor.com/cke4/builder
* Visit online builder to build CKEditor from scratch.
*
* (2) https://ckeditor.com/cke4/builder/70ddaf4a7e7615cc69d1d00879c6f1d1
* Visit online builder to build CKEditor, starting with the same setup as before.
*
* (3) https://ckeditor.com/cke4/builder/download/70ddaf4a7e7615cc69d1d00879c6f1d1
* Straight download link to the latest version of CKEditor (Optimized) with the same setup as before.
*
* NOTE:
* This file is not used by CKEditor, you may remove it.
* Changing this file will not change your CKEditor configuration.
*/
var CKBUILDER_CONFIG = {
skin: 'moono-lisa',
preset: 'full',
ignore: [
'.DS_Store',
'.bender',
'.editorconfig',
'.gitattributes',
'.gitignore',
'.idea',
'.jscsrc',
'.jshintignore',
'.jshintrc',
'.mailmap',
'.npm',
'.nvmrc',
'.travis.yml',
'bender-err.log',
'bender-out.log',
'bender-runner.config.json',
'bender.ci.js',
'bender.js',
'dev',
'gruntfile.js',
'less',
'node_modules',
'package-lock.json',
'package.json',
'tests'
],
plugins : {
'a11yhelp' : 1,
'about' : 1,
'basicstyles' : 1,
'bidi' : 1,
'blockquote' : 1,
'clipboard' : 1,
'colorbutton' : 1,
'colordialog' : 1,
'contextmenu' : 1,
'copyformatting' : 1,
'dialogadvtab' : 1,
'div' : 1,
'editorplaceholder' : 1,
'elementspath' : 1,
'enterkey' : 1,
'entities' : 1,
'exportpdf' : 1,
'filebrowser' : 1,
'find' : 1,
'floatingspace' : 1,
'font' : 1,
'format' : 1,
'forms' : 1,
'horizontalrule' : 1,
'htmlwriter' : 1,
'iframe' : 1,
'image' : 1,
'indentblock' : 1,
'indentlist' : 1,
'justify' : 1,
'language' : 1,
'link' : 1,
'list' : 1,
'liststyle' : 1,
'magicline' : 1,
'maximize' : 1,
'newpage' : 1,
'pagebreak' : 1,
'pastefromgdocs' : 1,
'pastefromlibreoffice' : 1,
'pastefromword' : 1,
'pastetext' : 1,
'preview' : 1,
'print' : 1,
'removeformat' : 1,
'resize' : 1,
'save' : 1,
'scayt' : 1,
'selectall' : 1,
'showblocks' : 1,
'showborders' : 1,
'smiley' : 1,
'sourcearea' : 1,
'specialchar' : 1,
'stylescombo' : 1,
'tab' : 1,
'table' : 1,
'tableselection' : 1,
'tabletools' : 1,
'templates' : 1,
'toolbar' : 1,
'undo' : 1,
'uploadimage' : 1,
'wysiwygarea' : 1
},
languages : {
'af' : 1,
'ar' : 1,
'az' : 1,
'bg' : 1,
'bn' : 1,
'bs' : 1,
'ca' : 1,
'cs' : 1,
'cy' : 1,
'da' : 1,
'de' : 1,
'de-ch' : 1,
'el' : 1,
'en' : 1,
'en-au' : 1,
'en-ca' : 1,
'en-gb' : 1,
'eo' : 1,
'es' : 1,
'es-mx' : 1,
'et' : 1,
'eu' : 1,
'fa' : 1,
'fi' : 1,
'fo' : 1,
'fr' : 1,
'fr-ca' : 1,
'gl' : 1,
'gu' : 1,
'he' : 1,
'hi' : 1,
'hr' : 1,
'hu' : 1,
'id' : 1,
'is' : 1,
'it' : 1,
'ja' : 1,
'ka' : 1,
'km' : 1,
'ko' : 1,
'ku' : 1,
'lt' : 1,
'lv' : 1,
'mk' : 1,
'mn' : 1,
'ms' : 1,
'nb' : 1,
'nl' : 1,
'no' : 1,
'oc' : 1,
'pl' : 1,
'pt' : 1,
'pt-br' : 1,
'ro' : 1,
'ru' : 1,
'si' : 1,
'sk' : 1,
'sl' : 1,
'sq' : 1,
'sr' : 1,
'sr-latn' : 1,
'sv' : 1,
'th' : 1,
'tr' : 1,
'tt' : 1,
'ug' : 1,
'uk' : 1,
'vi' : 1,
'zh' : 1,
'zh-cn' : 1
}
};

File diff suppressed because one or more lines are too long

View file

@ -1,20 +0,0 @@
{
"name": "ckeditor/ckeditor",
"description": "JavaScript WYSIWYG web text editor.",
"type": "library",
"keywords": [ "ckeditor4", "ckeditor", "fckeditor", "editor", "wysiwyg", "html", "richtext", "text", "javascript" ],
"homepage": "https://ckeditor.com/ckeditor-4/",
"license": [ "GPL-2.0+", "LGPL-2.1+", "MPL-1.1+" ],
"authors": [
{
"name": "CKSource",
"homepage": "https://cksource.com"
}
],
"support": {
"issues": "https://github.com/ckeditor/ckeditor4/issues",
"forum": "https://stackoverflow.com/tags/ckeditor",
"wiki": "https://ckeditor.com/docs/ckeditor4/latest/",
"source": "https://github.com/ckeditor/ckeditor4"
}
}

View file

@ -1,10 +0,0 @@
/**
* @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see https://ckeditor.com/legal/ckeditor-oss-license
*/
CKEDITOR.editorConfig = function( config ) {
// Define changes to default configuration here. For example:
// config.language = 'fr';
// config.uiColor = '#AADC6E';
};

View file

@ -1,208 +0,0 @@
/*
Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
CKEditor 4 LTS ("Long Term Support") is available under the terms of the Extended Support Model.
*/
body
{
/* Font */
/* Emoji fonts are added to visualise them nicely in Internet Explorer. */
font-family: sans-serif, Arial, Verdana, "Trebuchet MS", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
font-size: 12px;
/* Text color */
color: #333;
/* Remove the background color to make it transparent. */
background-color: #fff;
margin: 20px;
}
.cke_editable
{
font-size: 13px;
line-height: 1.6;
/* Fix for missing scrollbars with RTL texts. (#10488) */
word-wrap: break-word;
}
blockquote
{
font-style: italic;
font-family: Georgia, Times, "Times New Roman", serif;
padding: 2px 0;
border-style: solid;
border-color: #ccc;
border-width: 0;
}
.cke_contents_ltr blockquote
{
padding-left: 20px;
padding-right: 8px;
border-left-width: 5px;
}
.cke_contents_rtl blockquote
{
padding-left: 8px;
padding-right: 20px;
border-right-width: 5px;
}
a
{
color: #0782C1;
}
ol,ul,dl
{
/* IE7: reset rtl list margin. (#7334) */
*margin-right: 0px;
/* Preserved spaces for list items with text direction different than the list. (#6249,#8049)*/
padding: 0 40px;
}
h1,h2,h3,h4,h5,h6
{
font-weight: normal;
line-height: 1.2;
}
hr
{
border: 0px;
border-top: 1px solid #ccc;
}
img.right
{
border: 1px solid #ccc;
float: right;
margin-left: 15px;
padding: 5px;
}
img.left
{
border: 1px solid #ccc;
float: left;
margin-right: 15px;
padding: 5px;
}
pre
{
white-space: pre-wrap; /* CSS 2.1 */
word-wrap: break-word; /* IE7 */
-moz-tab-size: 4;
tab-size: 4;
}
.marker
{
background-color: Yellow;
}
span[lang]
{
font-style: italic;
}
figure
{
text-align: center;
outline: solid 1px #ccc;
background: rgba(0,0,0,0.05);
padding: 10px;
margin: 10px 20px;
display: inline-block;
}
figure > figcaption
{
text-align: center;
display: block; /* For IE8 */
}
a > img {
padding: 1px;
margin: 1px;
border: none;
outline: 1px solid #0782C1;
}
/* Widget Styles */
.code-featured
{
border: 5px solid red;
}
.math-featured
{
padding: 20px;
box-shadow: 0 0 2px rgba(200, 0, 0, 1);
background-color: rgba(255, 0, 0, 0.05);
margin: 10px;
}
.image-clean
{
border: 0;
background: none;
padding: 0;
}
.image-clean > figcaption
{
font-size: .9em;
text-align: right;
}
.image-grayscale
{
background-color: white;
color: #666;
}
.image-grayscale img, img.image-grayscale
{
filter: grayscale(100%);
}
.embed-240p
{
max-width: 426px;
max-height: 240px;
margin:0 auto;
}
.embed-360p
{
max-width: 640px;
max-height: 360px;
margin:0 auto;
}
.embed-480p
{
max-width: 854px;
max-height: 480px;
margin:0 auto;
}
.embed-720p
{
max-width: 1280px;
max-height: 720px;
margin:0 auto;
}
.embed-1080p
{
max-width: 1920px;
max-height: 1080px;
margin:0 auto;
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show more