diff --git a/.env.annur b/.env.annur new file mode 100644 index 0000000..a1d3da7 --- /dev/null +++ b/.env.annur @@ -0,0 +1,28 @@ +APP_NAME=Lumen +APP_ENV=production +APP_KEY=WbPGkYNmXZ6ZQplGlvl0iZ7zyW1b09xa +APP_DEBUG=true +APP_URL=https://apiannurv2.erahn.com.my +APP_TIMEZONE=Asia/Kuala_Lumpur + +LOG_CHANNEL=stack +LOG_SLACK_WEBHOOK_URL= + +DB_CONNECTION_2=mysql +DB_HOST_2=192.168.1.216 +DB_PORT_2=3306 +DB_DATABASE_2=annur_tampoi +DB_USERNAME_2=spider +DB_PASSWORD_2=arrahn@123 + +DB_CONNECTION_7=mysql +DB_HOST_7=192.168.1.216 +DB_PORT_7=3306 +DB_DATABASE_7=master_annur +DB_USERNAME_7=spider +DB_PASSWORD_7=arrahn@123 + +CACHE_DRIVER=file +QUEUE_CONNECTION=sync + +TENNANT_MASTER_DB=master_annur \ No newline at end of file diff --git a/.env.docker b/.env.docker index fedbeed..7cee720 100644 --- a/.env.docker +++ b/.env.docker @@ -4,6 +4,8 @@ APP_KEY=WbPGkYNmXZ6ZQplGlvl0iZ7zyW1b09xa APP_DEBUG=true APP_URL=http://localhost APP_TIMEZONE=Asia/Kuala_Lumpur +API_ARRAHNBID=http://lelong.test/api/ +API_ARRAHNBID_ANNUR=http://lelong-annur.test/api/ LOG_CHANNEL=stack LOG_LEVEL=debug @@ -62,5 +64,8 @@ DB_PASSWORD_7=root TENNANT_MASTER_DB=master_erahn TENNANT_KAUNTER_DB=kaunter_erahn +KAUNTER_URL=http://host.docker.internal:8081 +INTERNAL_NOTIFICATION_SECRET=erahn-local-notification-secret + CACHE_DRIVER=file QUEUE_CONNECTION=sync \ No newline at end of file diff --git a/.env.example b/.env.example index a4e9ab2..5ab7bba 100644 --- a/.env.example +++ b/.env.example @@ -5,6 +5,7 @@ APP_DEBUG=true APP_URL=http://api_arrahn.test APP_TIMEZONE=Asia/Kuala_Lumpur API_ARRAHNBID=http://lelong.test/api/ +API_ARRAHNBID_ANNUR=http://lelong-annur.test/api/ LOG_CHANNEL=stack LOG_SLACK_WEBHOOK_URL= @@ -86,172 +87,24 @@ DB_DATABASE_11=arrahn_pputeh DB_USERNAME_11=spider DB_PASSWORD_11=G0dz!ll42020 -DB_CONNECTION_12=mysql -DB_HOST_12=127.0.0.1 -DB_PORT_12=3306 -DB_DATABASE_12=arrahn_rpanjang -DB_USERNAME_12=spider -DB_PASSWORD_12=G0dz!ll42020 - -DB_CONNECTION_13=mysql -DB_HOST_13=127.0.0.1 -DB_PORT_13=3306 -DB_DATABASE_13=arrahn_tmerah -DB_USERNAME_13=spider -DB_PASSWORD_13=G0dz!ll42020 - -DB_CONNECTION_14=mysql -DB_HOST_14=127.0.0.1 -DB_PORT_14=3306 -DB_DATABASE_14=arrahn_wb -DB_USERNAME_14=spider -DB_PASSWORD_14=G0dz!ll42020 - -DB_CONNECTION_15=mysql -DB_HOST_15=127.0.0.1 -DB_PORT_15=3306 -DB_DATABASE_15=arrahn_wcy -DB_USERNAME_15=spider -DB_PASSWORD_15=G0dz!ll42020 - -DB_CONNECTION_16=mysql -DB_HOST_16=127.0.0.1 -DB_PORT_16=3306 -DB_DATABASE_16=arrahn_bentong -DB_USERNAME_16=spider -DB_PASSWORD_16=G0dz!ll42020 - -DB_CONNECTION_17=mysql -DB_HOST_17=192.168.0.102 -DB_PORT_17=3306 -DB_DATABASE_17=arrahn_kajang -DB_USERNAME_17=spider -DB_PASSWORD_17=G0dz!ll42020 - -DB_CONNECTION_18=mysql -DB_HOST_18=192.168.0.102 -DB_PORT_18=3306 -DB_DATABASE_18=arrahn_kangar -DB_USERNAME_18=spider -DB_PASSWORD_18=G0dz!ll42020 - -DB_CONNECTION_19=mysql -DB_HOST_19=192.168.0.102 -DB_PORT_19=3306 -DB_DATABASE_19=arrahn_kuantan -DB_USERNAME_19=spider -DB_PASSWORD_19=G0dz!ll42020 - -DB_CONNECTION_20=mysql -DB_HOST_20=192.168.0.102 -DB_PORT_20=3306 -DB_DATABASE_20=arrahn_pgudang -DB_USERNAME_20=spider -DB_PASSWORD_20=G0dz!ll42020 - -DB_CONNECTION_21=mysql -DB_HOST_21=192.168.0.102 -DB_PORT_21=3306 -DB_DATABASE_21=arrahn_raub -DB_USERNAME_21=spider -DB_PASSWORD_21=G0dz!ll42020 - -DB_CONNECTION_22=mysql -DB_HOST_22=192.168.0.102 -DB_PORT_22=3306 -DB_DATABASE_22=arrahn_rlaut -DB_USERNAME_22=spider -DB_PASSWORD_22=G0dz!ll42020 - -DB_CONNECTION_23=mysql -DB_HOST_23=192.168.0.102 -DB_PORT_23=3306 -DB_DATABASE_23=arrahn_skudai -DB_USERNAME_23=spider -DB_PASSWORD_23=G0dz!ll42020 - -DB_CONNECTION_24=mysql -DB_HOST_24=192.168.0.102 -DB_PORT_24=3306 -DB_DATABASE_24=arrahn_spetani -DB_USERNAME_24=spider -DB_PASSWORD_24=G0dz!ll42020 - -DB_CONNECTION_25=mysql -DB_HOST_25=192.168.0.102 -DB_PORT_25=3306 -DB_DATABASE_25=arrahn_temerloh -DB_USERNAME_25=spider -DB_PASSWORD_25=G0dz!ll42020 - -DB_CONNECTION_26=mysql -DB_HOST_26=192.168.0.103 -DB_PORT_26=3306 -DB_DATABASE_26=arrahn_api2 -DB_USERNAME_26=spider -DB_PASSWORD_26=G0dz!ll42020 - -DB_CONNECTION_27=mysql -DB_HOST_27=192.168.0.103 -DB_PORT_27=3306 -DB_DATABASE_27=arrahn_beaufort -DB_USERNAME_27=spider -DB_PASSWORD_27=G0dz!ll42020 - -DB_CONNECTION_28=mysql -DB_HOST_28=192.168.0.103 -DB_PORT_28=3306 -DB_DATABASE_28=arrahn_kbelud -DB_USERNAME_28=spider -DB_PASSWORD_28=G0dz!ll42020 - -DB_CONNECTION_29=mysql -DB_HOST_29=192.168.0.103 -DB_PORT_29=3306 -DB_DATABASE_29=arrahn_keningau -DB_USERNAME_29=spider -DB_PASSWORD_29=G0dz!ll42020 - -DB_CONNECTION_30=mysql -DB_HOST_30=192.168.0.103 -DB_PORT_30=3306 -DB_DATABASE_30=arrahn_putatan -DB_USERNAME_30=spider -DB_PASSWORD_30=G0dz!ll42020 - -DB_CONNECTION_31=mysql -DB_HOST_31=192.168.0.103 -DB_PORT_31=3306 -DB_DATABASE_31=arrahn_sandakan -DB_USERNAME_31=spider -DB_PASSWORD_31=G0dz!ll42020 - -DB_CONNECTION_32=mysql -DB_HOST_32=192.168.0.103 -DB_PORT_32=3306 -DB_DATABASE_32=arrahn_tawau -DB_USERNAME_32=spider -DB_PASSWORD_32=G0dz!ll42020 - -DB_CONNECTION_33=mysql -DB_HOST_33=192.168.0.103 -DB_PORT_33=3306 -DB_DATABASE_33=arrahn_tuaran -DB_USERNAME_33=spider -DB_PASSWORD_33=G0dz!ll42020 - CACHE_DRIVER=file QUEUE_CONNECTION=sync -WABOT_API=https://md.wabot.my/api/send.php -WABOT_INSTANCES_ID=63F40BD120DB4 -# WABOT_INSTANCES_ID=64892FD7440A6 -WABOT_TOKEN_KEYS=cbee7e95cf3ffbfa0531d5fddfd44f87 +MAX_MUTUEMAS=true +TENNANT_MASTER_DB=master_erahn +TENNANT_KAUNTER_DB=kaunter_erahn -ONEWAYSMS_API=http://gateway.onewaysms.com.my:10001/api.aspx -ONEWAYSMS_AUTH_USER=APIUK330HDAFO -ONEWAYSMS_AUTH_PASS=APIUK330HDAFOUK330 +KAUNTER_URL=http://host.docker.internal:8081 +INTERNAL_NOTIFICATION_SECRET= -ADMIN_PHONE_NUMBER=60178916936 -ACTIVE_JOB_SERVER=false +LOGVIEWER_PASSWORD= + +WHATSAPP_TOKEN= # Paste token from Graph API explorer. +WHATSAPP_PHONE_NUMBER_ID=1323449077519027 +WHATSAPP_API_VERSION=v25.0 +WHATSAPP_TEMPLATE=hello_world +WHATSAPP_TEMPLATE_LANG=en_US +WHATSAPP_VERIFY_TOKEN= # webhook verify token +WHATSAPP_APP_SECRET= # X-Hub-Signature-256 checks; need to be enable first +ADMIN_PHONE_NUMBER=60193450165 \ No newline at end of file diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..88259ea --- /dev/null +++ b/.env.production @@ -0,0 +1,89 @@ +APP_NAME=Lumen +APP_ENV=production +APP_KEY=WbPGkYNmXZ6ZQplGlvl0iZ7zyW1b09xa +APP_DEBUG=false +APP_URL=https://apiujrah.erahn.com.my +APP_TIMEZONE=Asia/Kuala_Lumpur +API_ARRAHNBID=https://adminbid-kopkb.erahn.com.my/api/ +API_ARRAHNBID_ANNUR=https://adminbid-annur.erahn.com.my/api/ + +LOG_CHANNEL=stack +LOG_SLACK_WEBHOOK_URL= +LOGVIEWER_PASSWORD="$2y$10$k7eiUyZdm3BruwAaT1gbmelTm.PPgZptOEQT1nlBjyiR84a4KBMlm" + +DB_CONNECTION_2=mysql +DB_HOST_2=192.168.1.216 +DB_PORT_2=3306 +DB_DATABASE_2=erahn_xtra +DB_USERNAME_2=spider +DB_PASSWORD_2=arrahn@123 + +DB_CONNECTION_3=mysql +DB_HOST_3=192.168.1.216 +DB_PORT_3=3306 +DB_DATABASE_3=erahn_baling +DB_USERNAME_3=spider +DB_PASSWORD_3=arrahn@123 + +DB_CONNECTION_4=mysql +DB_HOST_4=192.168.1.216 +DB_PORT_4=3306 +DB_DATABASE_4=arrahn_ld +DB_USERNAME_4=spider +DB_PASSWORD_4=arrahn@123 + +DB_CONNECTION_5=mysql +DB_HOST_5=192.168.1.216 +DB_PORT_5=3306 +DB_DATABASE_5=erahn_segamat +DB_USERNAME_5=spider +DB_PASSWORD_5=arrahn@123 + +DB_CONNECTION_6=mysql +DB_HOST_6=192.168.1.216 +DB_PORT_6=3306 +DB_DATABASE_6=erahn_terengganu +DB_USERNAME_6=spider +DB_PASSWORD_6=arrahn@123 + +DB_CONNECTION_8=mysql +DB_HOST_8=192.168.1.216 +DB_PORT_8=3306 +DB_DATABASE_8=erahn_benoni +DB_USERNAME_8=spider +DB_PASSWORD_8=arrahn@123 + +DB_CONNECTION_7=mysql +DB_HOST_7=192.168.1.216 +DB_PORT_7=3306 +DB_DATABASE_7=master_erahn +DB_USERNAME_7=spider +DB_PASSWORD_7=arrahn@123 + +DB_CONNECTION_9=mysql +DB_HOST_9=192.168.1.216 +DB_PORT_9=3306 +DB_DATABASE_9=annur_tampoi +DB_USERNAME_9=spider +DB_PASSWORD_9=arrahn@123 + +CACHE_DRIVER=file +QUEUE_CONNECTION=sync + +MAX_MUTUEMAS=true + +TENNANT_MASTER_DB=master_erahn +TENNANT_KAUNTER_DB=kaunter_erahn + +KAUNTER_URL=https://ujrah.erahn.com.my +INTERNAL_NOTIFICATION_SECRET="nIDTe(u@6[)VLJyd" + +WHATSAPP_CLOUD_ENABLED=true +WHATSAPP_TOKEN=EAAZAonT56AO0BSnZAhWLi4UXDRT6iAldbiybxSQZAnGrzIke1QiNWvQkZAbQQTjWeVZC5bL1gEBhW6ff3Shf79nowXiTQEwyxqgZAZB6ZATwFCeTs8MZA5H6ZA76IJBuVqRiAZBvZCfkeSurbUNpEWyi9W7zsT2GWiZCLX8meX0KCfDHu7cp4aBgVu1Ps5ZCRO3bP4ZCQZDZD +WHATSAPP_PHONE_NUMBER_ID=1375899418935337 +WHATSAPP_API_VERSION=v25.0 +WHATSAPP_TEMPLATE=hebahan_pembiayaan_online +WHATSAPP_TEMPLATE_LANG=ms +WHATSAPP_VERIFY_TOKEN=418ed86d49422071681c76bed25ae1cb7e90456c794a92f1c9ea417945a35a0a +WHATSAPP_APP_SECRET= +ADMIN_PHONE_NUMBER= \ No newline at end of file diff --git a/.env.staging b/.env.staging index 4f366ca..c3361cf 100644 --- a/.env.staging +++ b/.env.staging @@ -4,15 +4,16 @@ APP_KEY=WbPGkYNmXZ6ZQplGlvl0iZ7zyW1b09xa APP_DEBUG=true APP_URL=http://127.0.0.1:8090 APP_TIMEZONE=Asia/Kuala_Lumpur +API_ARRAHNBID=http://lelong.test/api/ +API_ARRAHNBID_ANNUR=http://lelong-annur.test/api/ -# Unique host ports — change these if they collide with other containers on the server. -# Host nginx should proxy the staging domain to 127.0.0.1:${HTTP_PORT} HTTP_PORT=8090 MYSQL_PUBLISH_PORT=3308 LOG_CHANNEL=stack LOG_LEVEL=debug LOG_SLACK_WEBHOOK_URL= +LOGVIEWER_PASSWORD=test123 DB_CONNECTION=mysql DB_HOST=mysql @@ -70,15 +71,30 @@ DB_DATABASE_6=erahn_test DB_USERNAME_6=root DB_PASSWORD_6=root -# DB_CONNECTION_8=mysql -# DB_HOST_8=mysql -# DB_PORT_8=3306 -# DB_DATABASE_8=arrahn_klanas -# DB_USERNAME_8=spider -# DB_PASSWORD_8=G0dz!ll42020 +DB_CONNECTION_9=mysql +DB_HOST_9=mysql +DB_PORT_9=3306 +DB_DATABASE_9=annur_tampoi +DB_USERNAME_9=root +DB_PASSWORD_9=root + +CACHE_DRIVER=file +QUEUE_CONNECTION=sync + +MAX_MUTUEMAS=true TENNANT_MASTER_DB=master_erahn TENNANT_KAUNTER_DB=kaunter_erahn -CACHE_DRIVER=file -QUEUE_CONNECTION=sync \ No newline at end of file +KAUNTER_URL=https://staging.erahn.com.my/login +INTERNAL_NOTIFICATION_SECRET=staging_noti_secret + +WHATSAPP_CLOUD_ENABLED=false +WHATSAPP_TOKEN=EAAZAonT56AO0BSnZAhWLi4UXDRT6iAldbiybxSQZAnGrzIke1QiNWvQkZAbQQTjWeVZC5bL1gEBhW6ff3Shf79nowXiTQEwyxqgZAZB6ZATwFCeTs8MZA5H6ZA76IJBuVqRiAZBvZCfkeSurbUNpEWyi9W7zsT2GWiZCLX8meX0KCfDHu7cp4aBgVu1Ps5ZCRO3bP4ZCQZDZD +WHATSAPP_PHONE_NUMBER_ID=1375899418935337 +WHATSAPP_API_VERSION=v25.0 +WHATSAPP_TEMPLATE=hebahan_pembiayaan_online +WHATSAPP_TEMPLATE_LANG=ms +WHATSAPP_VERIFY_TOKEN=418ed86d49422071681c76bed25ae1cb7e90456c794a92f1c9ea417945a35a0a +WHATSAPP_APP_SECRET= +ADMIN_PHONE_NUMBER= \ No newline at end of file diff --git a/.env.tukar b/.env.tukar deleted file mode 100644 index e2fe920..0000000 --- a/.env.tukar +++ /dev/null @@ -1,244 +0,0 @@ -APP_NAME=Lumen -APP_ENV=local -APP_KEY=WbPGkYNmXZ6ZQplGlvl0iZ7zyW1b09xa -APP_DEBUG=false -APP_URL=https://api.arrahn.com.my -APP_TIMEZONE=Asia/Kuala_Lumpur - - -LOG_CHANNEL=stack -LOG_SLACK_WEBHOOK_URL= - -DB_CONNECTION=mysql -DB_HOST=172.16.4.102 -DB_PORT=3306 -DB_DATABASE=arrahn_kb2 -DB_USERNAME=zone2 -DB_PASSWORD=G0dz!ll4@2020 - -DB_CONNECTION_2=mysql -DB_HOST_2=172.16.4.102 -DB_PORT_2=3306 -DB_DATABASE_2=arrahn_wcy -DB_USERNAME_2=zone2 -DB_PASSWORD_2=G0dz!ll4@2020 - -DB_CONNECTION_3=mysql -DB_HOST_3=172.16.4.102 -DB_PORT_3=3306 -DB_DATABASE_3=arrahn_1stop -DB_USERNAME_3=zone2 -DB_PASSWORD_3=G0dz!ll4@2020 - -DB_CONNECTION_4=mysql -DB_HOST_4=172.16.4.102 -DB_PORT_4=3306 -DB_DATABASE_4=arrahn_jlwt -DB_USERNAME_4=zone2 -DB_PASSWORD_4=G0dz!ll4@2020 - -DB_CONNECTION_5=mysql -DB_HOST_5=172.16.4.102 -DB_PORT_5=3306 -DB_DATABASE_5=arrahn_wb -DB_USERNAME_5=zone2 -DB_PASSWORD_5=G0dz!ll4@2020 - -DB_CONNECTION_6=mysql -DB_HOST_6=172.16.4.102 -DB_PORT_6=3306 -DB_DATABASE_6=arrahn_kls -DB_USERNAME_6=zone2 -DB_PASSWORD_6=G0dz!ll4@2020 - -DB_CONNECTION_7=mysql -DB_HOST_7=172.16.4.102 -DB_PORT_7=3306 -DB_DATABASE_7=online_arrahn -DB_USERNAME_7=zone2 -DB_PASSWORD_7=G0dz!ll4@2020 - -DB_CONNECTION_8=mysql -DB_HOST_8=172.16.4.102 -DB_PORT_8=3306 -DB_DATABASE_8=arrahn_pp -DB_USERNAME_8=zone2 -DB_PASSWORD_8=G0dz!ll4@2020 - -DB_CONNECTION_9=mysql -DB_HOST_9=172.16.4.102 -DB_PORT_9=3306 -DB_DATABASE_9=arrahn_mace -DB_USERNAME_9=zone2 -DB_PASSWORD_9=G0dz!ll4@2020 - -DB_CONNECTION_10=mysql -DB_HOST_10=172.16.4.102 -DB_PORT_10=3306 -DB_DATABASE_10=arrahn_pm -DB_USERNAME_10=zone2 -DB_PASSWORD_10=G0dz!ll4@2020 - -DB_CONNECTION_11=mysql -DB_HOST_11=172.16.4.102 -DB_PORT_11=3306 -DB_DATABASE_11=arrahn_gm -DB_USERNAME_11=zone2 -DB_PASSWORD_11=G0dz!ll4@2020 - -DB_CONNECTION_12=mysql -DB_HOST_12172.16.4.102 -DB_PORT_12=3306 -DB_DATABASE_12=arrahn_gcl -DB_USERNAME_12=zone2 -DB_PASSWORD_12=G0dz!ll4@2020 - -DB_CONNECTION_13=mysql -DB_HOST_13=172.16.4.102 -DB_PORT_13=3306 -DB_DATABASE_13=arrahn_jli -DB_USERNAME_13=zone2 -DB_PASSWORD_13=G0dz!ll4@2020 - -DB_CONNECTION_14=mysql -DB_HOST_14=172.16.4.102 -DB_PORT_14=3306 -DB_DATABASE_14=arrahn_rp -DB_USERNAME_14=zone2 -DB_PASSWORD_14=G0dz!ll4@2020 - -DB_CONNECTION_15=mysql -DB_HOST_15=172.16.4.102 -DB_PORT_15=3306 -DB_DATABASE_15=arrahn_ktn -DB_USERNAME_15=zone2 -DB_PASSWORD_15=G0dz!ll4@2020 - -DB_CONNECTION_16=mysql -DB_HOST_16=172.16.4.102 -DB_PORT_16=3306 -DB_DATABASE_16=arrahn_pg -DB_USERNAME_16=zone2 -DB_PASSWORD_16=G0dz!ll4@2020 - -DB_CONNECTION_17=mysql -DB_HOST_17=172.16.4.102 -DB_PORT_17=3306 -DB_DATABASE_17=arrahn_skudai -DB_USERNAME_17=zone2 -DB_PASSWORD_17=G0dz!ll4@2020 - -DB_CONNECTION_18=mysql -DB_HOST_18=172.16.4.102 -DB_PORT_18=3306 -DB_DATABASE_18=arrahn_pttn -DB_USERNAME_18=zone2 -DB_PASSWORD_18=G0dz!ll4@2020 - -DB_CONNECTION_19=mysql -DB_HOST_19=172.16.4.102 -DB_PORT_19=3306 -DB_DATABASE_19=arrahn_btg -DB_USERNAME_19=zone2 -DB_PASSWORD_19=G0dz!ll4@2020 - -DB_CONNECTION_20=mysql -DB_HOST_20=172.16.4.102 -DB_PORT_20=3306 -DB_DATABASE_20=arrahn_raub -DB_USERNAME_20=zone2 -DB_PASSWORD_20=G0dz!ll4@2020 - -DB_CONNECTION_21=mysql -DB_HOST_21=172.16.4.102 -DB_PORT_21=3306 -DB_DATABASE_21=arrahn_kgr -DB_USERNAME_21=zone2 -DB_PASSWORD_21=G0dz!ll4@2020 - -DB_CONNECTION_22=mysql -DB_HOST_22=172.16.4.102 -DB_PORT_22=3306 -DB_DATABASE_22=arrahn_sdk -DB_USERNAME_22=zone2 -DB_PASSWORD_22=G0dz!ll4@2020 - -DB_CONNECTION_23=mysql -DB_HOST_23=172.16.4.102 -DB_PORT_23=3306 -DB_DATABASE_23=arrahn_sp -DB_USERNAME_23=zone2 -DB_PASSWORD_23=G0dz!ll4@2020 - -DB_CONNECTION_24=mysql -DB_HOST_24=172.16.4.102 -DB_PORT_24=3306 -DB_DATABASE_24=arrahn_twu -DB_USERNAME_24=zone2 -DB_PASSWORD_24=G0dz!ll4@2020 - -DB_CONNECTION_25=mysql -DB_HOST_25=172.16.4.102 -DB_PORT_25=3306 -DB_DATABASE_25=arrahn_api2 -DB_USERNAME_25=zone2 -DB_PASSWORD_25=G0dz!ll4@2020 - -DB_CONNECTION_26=mysql -DB_HOST_26=172.16.4.102 -DB_PORT_26=3306 -DB_DATABASE_26=arrahn_kjg -DB_USERNAME_26=zone2 -DB_PASSWORD_26=G0dz!ll4@2020 - -DB_CONNECTION_27=mysql -DB_HOST_27=172.16.4.102 -DB_PORT_27=3306 -DB_DATABASE_27=arrahn_rl -DB_USERNAME_27=zone2 -DB_PASSWORD_27=G0dz!ll4@2020 - -DB_CONNECTION_28=mysql -DB_HOST_28=172.16.4.102 -DB_PORT_28=3306 -DB_DATABASE_28=arrahn_bfort -DB_USERNAME_28=zone2 -DB_PASSWORD_28=G0dz!ll4@2020 - -DB_CONNECTION_29=mysql -DB_HOST_29=172.16.4.102 -DB_PORT_29=3306 -DB_DATABASE_29=arrahn_kbelud -DB_USERNAME_29=zone2 -DB_PASSWORD_29=G0dz!ll4@2020 - -DB_CONNECTION_30=mysql -DB_HOST_30=172.16.4.102 -DB_PORT_30=3306 -DB_DATABASE_30=arrahn_tuaran -DB_USERNAME_30=zone2 -DB_PASSWORD_30=G0dz!ll4@2020 - -DB_CONNECTION_31=mysql -DB_HOST_31=172.16.4.102 -DB_PORT_31=3306 -DB_DATABASE_31=arrahn_kngau -DB_USERNAME_31=zone2 -DB_PASSWORD_31=G0dz!ll4@2020 - -DB_CONNECTION_32=mysql -DB_HOST_32=172.16.4.102 -DB_PORT_32=3306 -DB_DATABASE_32=arrahn_tm -DB_USERNAME_32=zone2 -DB_PASSWORD_32=G0dz!ll4@2020 - -DB_CONNECTION_33=mysql -DB_HOST_33=172.16.4.102 -DB_PORT_33=3306 -DB_DATABASE_33=arrahn_tmlh -DB_USERNAME_33=zone2 -DB_PASSWORD_33=G0dz!ll4@2020 - -CACHE_DRIVER=file -QUEUE_CONNECTION=sync diff --git a/.gitea/workflows/deploy-staging.yml b/.gitea/workflows/deploy-staging.yml index 6306033..9adaa96 100644 --- a/.gitea/workflows/deploy-staging.yml +++ b/.gitea/workflows/deploy-staging.yml @@ -1,6 +1,9 @@ name: Deploy to Staging on: + push: + tags: + - "v*" workflow_dispatch: inputs: image_tag: @@ -18,10 +21,22 @@ jobs: runs-on: host steps: + - name: Resolve image tag + id: resolve + run: | + set -e + if [ "${{ gitea.event_name }}" = "workflow_dispatch" ]; then + IMAGE_TAG="${{ inputs.image_tag }}" + else + IMAGE_TAG="${{ gitea.ref_name }}" + fi + echo "IMAGE_TAG=${IMAGE_TAG}" >> "$GITHUB_OUTPUT" + echo "Deploying image tag: ${IMAGE_TAG}" + - name: Checkout repository uses: actions/checkout@v4 with: - ref: ${{ inputs.image_tag }} + ref: ${{ steps.resolve.outputs.IMAGE_TAG }} - name: Login to Docker registry run: | @@ -33,43 +48,47 @@ jobs: - name: Verify image exists in registry run: | set -e - IMAGE_TAG="${{ inputs.image_tag }}" + IMAGE_TAG="${{ steps.resolve.outputs.IMAGE_TAG }}" IMAGE="${APP_IMAGE}:${IMAGE_TAG}" echo "Checking if image exists: ${IMAGE}" - if ! docker manifest inspect "${IMAGE}" > /dev/null 2>&1; then - echo "ERROR: Image ${IMAGE} does not exist in registry!" - echo "Run the Build Docker Image workflow first." - exit 1 - fi - echo "✓ ${IMAGE} found" + # Tag pushes build in parallel — wait for the image to appear + for i in $(seq 1 30); do + if docker manifest inspect "${IMAGE}" > /dev/null 2>&1; then + echo "✓ ${IMAGE} found" + exit 0 + fi + echo "Image not ready yet (attempt ${i}/30), waiting 20s..." + sleep 20 + done + + echo "ERROR: Image ${IMAGE} does not exist in registry after waiting!" + echo "Run the Build Docker Image workflow first." + exit 1 - name: Pull Docker image run: | set -e - IMAGE_TAG="${{ inputs.image_tag }}" + IMAGE_TAG="${{ steps.resolve.outputs.IMAGE_TAG }}" docker pull "${APP_IMAGE}:${IMAGE_TAG}" echo "✓ Image pulled successfully" - name: Sync compose file and deploy run: | set -e - IMAGE_TAG="${{ inputs.image_tag }}" + IMAGE_TAG="${{ steps.resolve.outputs.IMAGE_TAG }}" mkdir -p "${DEPLOY_DIR}/docker/nginx" "${DEPLOY_DIR}/docker/mysql" cp docker-compose.staging.yml "${DEPLOY_DIR}/docker-compose.yml" cp docker/nginx/default.conf "${DEPLOY_DIR}/docker/nginx/default.conf" cp -R docker/mysql/init "${DEPLOY_DIR}/docker/mysql/" - if [ ! -f "${DEPLOY_DIR}/.env.staging" ]; then - if [ -f .env.staging ]; then - cp .env.staging "${DEPLOY_DIR}/.env.staging" - echo "Copied .env.staging from repo (first deploy). Edit ${DEPLOY_DIR}/.env.staging on the server if needed." - else - echo "ERROR: ${DEPLOY_DIR}/.env.staging is missing on the server" - exit 1 - fi + if [ ! -f .env.staging ]; then + echo "ERROR: .env.staging is missing in the repository" + exit 1 fi + cp .env.staging "${DEPLOY_DIR}/.env.staging" + echo "✓ Synced .env.staging from repo" cd "${DEPLOY_DIR}" diff --git a/README.md b/README.md index bd2926b..cea8ad4 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Tebus=penyelesaian penuh/ansuran docker exec -i api_arrahn_staging_mysql mysql -uroot -proot erahn_test < erahn_test.sql ``` -## Disable the cawangan in arrahn_master_db +## Disable the cawangan in arrahn_master_db using feature flag ## Feature Flag 1. Register the flag in api_arrahn/app/Feature.php diff --git a/app/Console/Commands/WhatsappTestSend.php b/app/Console/Commands/WhatsappTestSend.php new file mode 100644 index 0000000..a5d467e --- /dev/null +++ b/app/Console/Commands/WhatsappTestSend.php @@ -0,0 +1,56 @@ +isConfigured()) { + $this->error('Set WHATSAPP_TOKEN and WHATSAPP_PHONE_NUMBER_ID in .env first.'); + return 1; + } + + $to = $client->normalizeMsisdn($this->option('to') ?: env('ADMIN_PHONE_NUMBER')); + if (!$to) { + $this->error('Pass --to=60193450165 or set ADMIN_PHONE_NUMBER.'); + return 1; + } + + $template = config('whatsapp.template', 'hello_world'); + $lang = config('whatsapp.template_lang', 'en_US'); + $bodyParams = []; + + if (strtolower($template) !== 'hello_world') { + // pembiayaan_online_paid: SAG, amaun, bank, 4 digit akhir, tarikh, rujukan + $bodyParams = [ + 'TEST-SAG', + '100.00', + 'Maybank', + '1234', + date('d/m/Y'), + 'TEST-REF', + ]; + } + + $this->info("Sending {$template} ({$lang}) to {$to} …"); + $response = $client->sendTemplate($to, $template, $lang, $bodyParams); + + if ($response->successful()) { + $this->info('OK ' . $response->status() . ' ' . $response->body()); + return 0; + } + + $this->error('FAIL ' . $response->status() . ' ' . $response->body()); + return 1; + } +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 9308414..6723bdd 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -24,6 +24,7 @@ class Kernel extends ConsoleKernel Commands\ClearCachesAll::class, Commands\RestartSupervisor::class, Commands\InsertSempornaData::class, + Commands\WhatsappTestSend::class, //Commands\ImportCsv::class, ]; diff --git a/app/Feature.php b/app/Feature.php index 398ed5f..79efd1e 100644 --- a/app/Feature.php +++ b/app/Feature.php @@ -5,6 +5,7 @@ namespace App; class Feature { const PEMBIAYAAN_ONLINE = 'pembiayaan_online'; + const REBET_ANNUR = 'rebet_annur'; /** * Known flag keys. New features: add a constant here, then INSERT rows for pilot kodcaw. @@ -15,6 +16,7 @@ class Feature { return [ self::PEMBIAYAAN_ONLINE, + self::REBET_ANNUR, ]; } @@ -40,9 +42,32 @@ class Feature { return [ self::PEMBIAYAAN_ONLINE => 'Pembiayaan Online', + self::REBET_ANNUR => 'Rebet / diskaun Annur', ]; } + /** + * Lelong portal base URL for this branch. rebet_annur branches (Annur/Tampoi) + * use API_ARRAHNBID_ANNUR; everyone else uses API_ARRAHNBID. + * + * Always returned with a trailing slash so callers can append 'portalApi'. + * + * @param string $kodcaw + * @return string + */ + public static function arrahnbidUrl($kodcaw) + { + $url = config('app_parameter.api_arrahnbid'); + if ($kodcaw && self::enabled($kodcaw, self::REBET_ANNUR)) { + $annur = config('app_parameter.api_arrahnbid_annur'); + if ($annur) { + $url = $annur; + } + } + + return rtrim((string) $url, '/') . '/'; + } + /** * Missing row is off (fail closed). * diff --git a/app/Gadai.php b/app/Gadai.php index c8037c3..be4a77e 100644 --- a/app/Gadai.php +++ b/app/Gadai.php @@ -9,6 +9,10 @@ class Gadai extends Model protected $table = 'gadai'; public $timestamps = false; + protected $attributes = [ + 'cara_terima' => 'TUNAI', + ]; + /** * The attributes that are mass assignable. * @@ -74,7 +78,9 @@ class Gadai extends Model 'tagkomuditi', 'tempohbayar', 'lelong_tawarruq', - 'tag_tebus' + 'tag_tebus', + 'kadarrebet', + 'diskaun' ]; /** diff --git a/app/Http/Controllers/CawanganController.php b/app/Http/Controllers/CawanganController.php index f6f5df8..e01b692 100644 --- a/app/Http/Controllers/CawanganController.php +++ b/app/Http/Controllers/CawanganController.php @@ -26,6 +26,7 @@ class CawanganController extends Controller $data = $cawangan->toArray(); $data['features'] = Feature::mapFor($code_cawangan); + $data['api_arrahnbid'] = Feature::arrahnbidUrl($code_cawangan); return response()->json($data); } diff --git a/app/Http/Controllers/GadaiController.php b/app/Http/Controllers/GadaiController.php index 942cc85..0c8006f 100644 --- a/app/Http/Controllers/GadaiController.php +++ b/app/Http/Controllers/GadaiController.php @@ -537,7 +537,7 @@ class GadaiController extends Controller public function getLaporanGadai($kodcaw,$tarikh){ $cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$kodcaw)->first(); - $gadai_data = Gadai::on($cawangan['mysql'])->select('t_gadai','norujukan','nokp','semakbarcode','masa','berat','nilaimarhun','pinjaman','upah12','percentpinj','teller','nokp','ujrah','onepercent') + $gadai_data = Gadai::on($cawangan['mysql'])->select('cara_terima','t_gadai','norujukan','nokp','semakbarcode','masa','berat','nilaimarhun','pinjaman','upah12','percentpinj','teller','nokp','ujrah','onepercent','kadarrebet','diskaun') ->where('t_gadai','=',$tarikh) ->orderBy('teller') ->orderBy('sirig') @@ -551,6 +551,7 @@ class GadaiController extends Controller array_push($gadai,[ "t_gadai"=> $gadaiData['t_gadai'], "norujukan"=> $gadaiData['norujukan'], + "cara_terima"=> $gadaiData['cara_terima'], "nama"=> $customer_info['nama'], "nokp"=> $gadaiData['nokp'], "semakbarcode"=> $gadaiData['semakbarcode'], @@ -563,7 +564,9 @@ class GadaiController extends Controller "alamat1"=> $customer_info['alamat1'], "teller"=> $gadaiData['teller'], "onepercent"=> $gadaiData['onepercent'], - "ujrah"=> $gadaiData['ujrah'] + "ujrah"=> $gadaiData['ujrah'], + "kadarrebet"=> $gadaiData['kadarrebet'], + "diskaun"=> $gadaiData['diskaun'] ]); } } @@ -626,7 +629,7 @@ class GadaiController extends Controller "alamat1" => optional($customer)->alamat1, "t_gadai" => $g->t_gadai, "norujukan" => $g->norujukan, - "norujukan"=> $g->norujukan, + "cara_terima" => strtoupper((string) ($g->cara_terima ?: 'TUNAI')), "nokp"=> $g->nokp, "semakbarcode"=> $g->semakbarcode, @@ -640,6 +643,8 @@ class GadaiController extends Controller "teller"=> $g->teller, "ujrah"=> $g->ujrah, "onepercent"=> $g->onepercent, + "kadarrebet"=> $g->kadarrebet, + "diskaun"=> $g->diskaun, "tagbaru"=> $g->tagbaru, "kodkerja"=> optional($customer)->kodkerja, "bangsa"=> optional($customer)->bangsa, diff --git a/app/Http/Controllers/KelulusanController.php b/app/Http/Controllers/KelulusanController.php index 89e7647..87cb123 100644 --- a/app/Http/Controllers/KelulusanController.php +++ b/app/Http/Controllers/KelulusanController.php @@ -8,6 +8,7 @@ use App\Cawangan; use App\Mohonid; use App\MohonAnggota; use App\Customer; +use App\Services\StaffNotificationClient; use Carbon\Carbon; @@ -444,6 +445,8 @@ public function create(REQUEST $request,$kodcaw,$norujukan,$roles) $audit->updated_at = $harini; $audit->save(); + $this->notifyOperasiAssignAnggota($kodcaw, $cawangan, $kelulusan, $request); + // ✅ Return JSON response ke frontend return response()->json([ 'success' => true, @@ -466,6 +469,58 @@ public function create(REQUEST $request,$kodcaw,$norujukan,$roles) } } + /** + * Inbox for all operasi staff. Failures must not block the teller request. + * + * @param string $kodcaw + * @param \App\Cawangan $cawangan + * @param \App\MohonAnggota $kelulusan + * @param \Illuminate\Http\Request $request + * @return void + */ + protected function notifyOperasiAssignAnggota($kodcaw, $cawangan, $kelulusan, Request $request) + { + try { + $nama = trim((string) ($request->nama ?? '')); + if ($nama === '' && !empty($kelulusan->nokp)) { + $customer = Customer::on('mysql7') + ->where('kpbaru', $kelulusan->nokp) + ->orWhere('kplama', $kelulusan->nokp) + ->first(); + if ($customer && !empty($customer->nama)) { + $nama = trim((string) $customer->nama); + } + } + + $namaCaw = $kodcaw; + if ($cawangan) { + $resolved = trim((string) $cawangan->nama_cawangan); + if ($resolved !== '') { + $namaCaw = $resolved; + } + } + + app(StaffNotificationClient::class)->notify([ + 'type' => 'anggota.pending_operasi', + 'cawangan' => $kodcaw, + 'audience' => ['role' => 'operasi'], + 'data' => [ + 'id' => $kelulusan->id, + 'nokp' => $kelulusan->nokp, + 'nama' => $nama, + 'teller' => $kelulusan->teller, + 'komen' => $kelulusan->komen, + 'cawangan_nama' => $namaCaw, + ], + ]); + } catch (\Throwable $e) { + Log::warning('Assign anggota operasi notification failed: '.$e->getMessage(), [ + 'kodcaw' => $kodcaw, + 'nokp' => isset($kelulusan->nokp) ? $kelulusan->nokp : null, + ]); + } + } + //KEPOHONAN EDIT DAN HAPUS public function kepohonancreate(REQUEST $request,$kodcaw,$norujukan) @@ -600,26 +655,86 @@ public function create(REQUEST $request,$kodcaw,$norujukan,$roles) return response()->json($arraykelulusan,200); } - public function listoperasikelulusan() + public function listoperasikelulusan(Request $request) { - $harini = Carbon::now(); - $harini = new Carbon; + $dateFrom = $request->query('date_from'); + $dateTo = $request->query('date_to'); + $search = trim((string) $request->query('search', '')); + + // Default to last 30 days to avoid loading entire history + if (!$dateFrom && !$dateTo) { + $dateTo = Carbon::now()->toDateString(); + $dateFrom = Carbon::now()->subDays(30)->toDateString(); + } + + $cawangan_all = Cawangan::on('mysql7') + ->select('mysql', 'details_caw', 'kodcaw') + ->get(); - $cawangan_all = Cawangan::on('mysql7')->get(); $arraykelulusan = []; - foreach($cawangan_all as $index=>$cawangan){ - $kelulusan=Mohon::on($cawangan['mysql']) - ->where('peloperasi','=','operasi') - ->where('operasi','!=','') - ->get(); + foreach ($cawangan_all as $cawangan) { + $query = Mohon::on($cawangan['mysql']) + ->select([ + 'tarikh', + 'norujukan', + 'komen', + 'jumpinj', + 'nilaimarhun', + 'berat', + 'margin', + 'status', + 'operasi', + 'masalulus', + ]) + ->where('peloperasi', '=', 'operasi') + ->where('operasi', '!=', ''); - if(sizeof($kelulusan) != 0){ - array_push($arraykelulusan,["kelulusanall" => $kelulusan,"cawangan" => $cawangan['details_caw'],"cawangankod" => $cawangan['kodcaw']]); + if ($dateFrom) { + $query->where('tarikh', '>=', $dateFrom); + } + if ($dateTo) { + $query->where('tarikh', '<=', $dateTo); + } + if ($search !== '') { + $query->where(function ($q) use ($search) { + $q->where('norujukan', 'like', "%{$search}%") + ->orWhere('operasi', 'like', "%{$search}%") + ->orWhere('status', 'like', "%{$search}%") + ->orWhere('komen', 'like', "%{$search}%"); + }); } - } - return response()->json($arraykelulusan,200); + $kelulusan = $query->orderBy('tarikh', 'desc')->get(); + + foreach ($kelulusan as $kel) { + $komenParts = explode('|', (string) ($kel->komen ?? '')); + $komenParts = array_values(array_filter($komenParts, function ($part) { + return $part !== ''; + })); + + $arraykelulusan[] = [ + 'tarikh' => $kel->tarikh ?? '-', + 'norujukan' => $kel->norujukan ?? '-', + 'status' => $kel->status ?? '-', + 'komen' => $komenParts[0] ?? ($kel->komen ?: '-'), + 'pinjaman' => $kel->jumpinj ?? '-', + 'nilaimarhun' => $komenParts[1] ?? ($kel->nilaimarhun ?? '-'), + 'berat' => $komenParts[2] ?? ($kel->berat ?? '-'), + 'margin' => $komenParts[3] ?? ($kel->margin ?? '-'), + 'pelulus' => $kel->operasi ?? '-', + 'masalulus' => $kel->masalulus ?? '-', + 'cawangan' => $cawangan['details_caw'], + 'cawangankod' => $cawangan['kodcaw'], + ]; + } + } + + usort($arraykelulusan, function ($a, $b) { + return strcmp((string) ($b['tarikh'] ?? ''), (string) ($a['tarikh'] ?? '')); + }); + + return response()->json($arraykelulusan, 200); } public function UpdateHapusAnsuranOperasi(Request $request){ diff --git a/app/Http/Controllers/LelongController.php b/app/Http/Controllers/LelongController.php index d959f20..e32dbfa 100644 --- a/app/Http/Controllers/LelongController.php +++ b/app/Http/Controllers/LelongController.php @@ -11,6 +11,7 @@ use App\Negeri; use App\Lelong; use App\Transaction; use App\Cawangan; +use App\Feature; use App\Gadai; use App\TuntutBaki; use App\WTD; @@ -26,6 +27,7 @@ use App\Tunai; use App\Audit; use App\GlDetail; use App\Pembeli; +use Illuminate\Http\Client\ConnectionException; use Illuminate\Http\Request; use Illuminate\Support\Facades\Http; use App\Services\RingkasanHarianServices; @@ -604,16 +606,7 @@ class LelongController extends Controller $cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$request->kodcaw)->first(); if($cawangan['tagarrahnbid'] == 1){ - if(env('APP_ENV') != 'production'){ - $link = 'https://adminbid-kopkb.erahn.com.my/api/portalApi'; - }else{ - $link = 'https://adminbid-kopkb.erahn.com.my/api/portalApi'; - } - - $lelong = Http::withOptions(['verify' => true])->get($link,[ - 'norujukan' => $request->norujukan - ])->json(); - $lelong = ($lelong != null) ? $lelong['lelong'] : []; + $lelong = $this->fetchPortalLelong($request->kodcaw, $request->norujukan); if( $lelong == null ) { $lelong = Lelong::on($cawangan['mysql']) @@ -656,10 +649,7 @@ class LelongController extends Controller $cawangan = Cawangan::on('mysql7')->where('kodcaw', '=', $request->kodcaw)->first(); if ($cawangan['tagarrahnbid'] == 0){ - $lelong = Http::withOptions(['verify' => true])->get(config('app_parameter.api_arrahnbid').'portalApi',[ - 'norujukan' => $request->norujukan - ])->json(); - $lelong = ($lelong != null) ? $lelong['lelong'] : []; + $lelong = $this->fetchPortalLelong($request->kodcaw, $request->norujukan); if( $lelong == null ) { $lelong = Lelong::on($cawangan['mysql']) @@ -729,8 +719,8 @@ class LelongController extends Controller if($cawangan['tagarrahnbid'] == 1) { - $lelong = Http::withOptions(['verify' => true])->get(config('app_parameter.api_arrahnbid').'portalApi',['norujukan' => $request->norujukan])->json(); - $lelong = ($lelong != null) ? $lelong['lelong'] : []; + $lelong = $this->fetchPortalLelong($request->kodcaw, $request->norujukan); + $lelong = ($lelong != null) ? $lelong : []; }else{ $lelong = Lelong::on($cawangan['mysql'])->where([['norujukan',$request->norujukan]])->first(); } @@ -2009,4 +1999,31 @@ class LelongController extends Controller ], 200); } + /** + * Fetch lelong status from arrahnbid. Returns null when the portal is + * unreachable so callers can fall back to the local lelong table. + */ + private function fetchPortalLelong($kodcaw, $norujukan) + { + try { + $payload = Http::withOptions(['verify' => true]) + ->timeout(5) + ->get(Feature::arrahnbidUrl($kodcaw).'portalApi', [ + 'norujukan' => $norujukan, + ]) + ->json(); + + return ($payload != null) ? ($payload['lelong'] ?? null) : null; + } catch (ConnectionException $e) { + Log::warning('Arrahnbid portal unreachable; falling back to local lelong.', [ + 'kodcaw' => $kodcaw, + 'norujukan' => $norujukan, + 'url' => Feature::arrahnbidUrl($kodcaw).'portalApi', + 'error' => $e->getMessage(), + ]); + + return null; + } + } + } diff --git a/app/Http/Controllers/MarhunController.php b/app/Http/Controllers/MarhunController.php index d35e7f1..cf5d893 100644 --- a/app/Http/Controllers/MarhunController.php +++ b/app/Http/Controllers/MarhunController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers; use App\Marhun; +use App\Gadai; use App\Jemas; use App\Cawangan; use Illuminate\Http\Request; @@ -160,39 +161,53 @@ class MarhunController extends Controller $cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$kodcaw)->first(); - $old_data = Marhun::on($cawangan['mysql'])->where([['recno','=',$request->recno],['norujukan','=',$norujukan]])->first(); + // Lock the parent first so concurrent edits to this SAG are serialized. + (new Marhun)->setConnection($cawangan['mysql'])->getConnection()->transaction(function () use ($cawangan, $norujukan, $request, $harga, $nilai_marhun, $kodcaw, $current) { + Gadai::on($cawangan['mysql'])->where('norujukan', $norujukan)->lockForUpdate()->firstOrFail(); + $old_data = Marhun::on($cawangan['mysql'])->where([['recno','=',$request->recno],['norujukan','=',$norujukan]])->firstOrFail(); - $marhunToUpdate = [ - 'karat' => $request->karat, - 'marhun' => $request->marhun, - 'nota' => $request->nota, - 'tag_permata' => $request->tag_permata, - 'berat_batu_permata' => $request->berat_batu_permata, - 'berat' => $request->berat, - 'harga' => $harga['harga'], - 'n_marhun' => $nilai_marhun, - 'bil' => $request->kuantiti, - ]; + $marhunToUpdate = [ + 'karat' => $request->karat, + 'marhun' => $request->marhun, + 'nota' => $request->nota, + 'tag_permata' => $request->tag_permata, + 'berat_batu_permata' => $request->berat_batu_permata, + 'berat' => $request->berat, + 'harga' => $harga['harga'], + 'n_marhun' => $nilai_marhun, + 'bil' => $request->kuantiti, + ]; - // Set value berat_batu_permata to null if value passed is null - if($marhunToUpdate['berat_batu_permata'] == '') { - $marhunToUpdate['berat_batu_permata'] = null; - }; + // Set value berat_batu_permata to null if value passed is null + if($marhunToUpdate['berat_batu_permata'] == '') { + $marhunToUpdate['berat_batu_permata'] = null; + }; - $jemas = Marhun::on($cawangan['mysql'])->where([['recno','=',$request->recno],['norujukan','=',$norujukan]])->update($marhunToUpdate); + $jemas = Marhun::on($cawangan['mysql'])->where([['recno','=',$request->recno],['norujukan','=',$norujukan]])->update($marhunToUpdate); - $new_data = Marhun::on($cawangan['mysql'])->where([['recno','=',$request->recno],['norujukan','=',$norujukan]])->first(); + // Recalculate from every item belonging to this SAG, after the edit. + $totals = Marhun::on($cawangan['mysql'])->where('norujukan', $norujukan) + ->selectRaw('COALESCE(SUM(berat), 0) AS total_berat, COALESCE(SUM(n_marhun), 0) AS total_nilai, COALESCE(SUM(bil), 0) AS total_kuantiti') + ->first(); + Gadai::on($cawangan['mysql'])->where('norujukan', $norujukan)->update([ + 'berat' => $totals->total_berat, + 'nilaimarhun' => $totals->total_nilai, + 'kuantiti' => $totals->total_kuantiti, + ]); - $audit = new Audit(); - $audit->users = $request->teller; - $audit->actions = 'Ubah Marhun'; - $audit->norujukan = $norujukan; - $audit->old_data = $old_data; - $audit->new_data = $new_data; - $audit->kodcaw = $kodcaw; - $audit->created_at = $current; - $audit->updated_at = $current; - $audit->save(); + $new_data = Marhun::on($cawangan['mysql'])->where([['recno','=',$request->recno],['norujukan','=',$norujukan]])->first(); + + $audit = new Audit(); + $audit->users = $request->teller; + $audit->actions = 'Ubah Marhun'; + $audit->norujukan = $norujukan; + $audit->old_data = $old_data; + $audit->new_data = $new_data; + $audit->kodcaw = $kodcaw; + $audit->created_at = $current; + $audit->updated_at = $current; + $audit->save(); + }); return response('Edit Successfully', 200); } diff --git a/app/Http/Controllers/PembiayaanOnlineController.php b/app/Http/Controllers/PembiayaanOnlineController.php index 700fdd0..547736f 100644 --- a/app/Http/Controllers/PembiayaanOnlineController.php +++ b/app/Http/Controllers/PembiayaanOnlineController.php @@ -35,6 +35,14 @@ class PembiayaanOnlineController extends Controller return $this->respond($this->service->show($kodcaw, $norujukan)); } + /** + * GET /api/pembiayaan-online/{kodcaw}/lines/{id} + */ + public function showLine($kodcaw, $id) + { + return $this->respond($this->service->showLine($kodcaw, $id)); + } + /** * GET /api/pembiayaan-online/{kodcaw}/queue */ @@ -53,6 +61,7 @@ class PembiayaanOnlineController extends Controller foreach ([ 'kodbank', 'noakaun', 'nama_bank', 'nama_akaun', 'nota', 'bukti_akaun_file_id', 'borang_file_id', 'update_customer_bank', + 'bukti_akaun_data', 'bukti_akaun_filename', 'bukti_akaun_type', ] as $key) { if ($request->has($key)) { $input[$key] = $request->input($key); @@ -62,6 +71,26 @@ class PembiayaanOnlineController extends Controller return $this->respond($this->service->updateLine($kodcaw, $id, $input)); } + /** + * POST /api/pembiayaan-online/{kodcaw}/lines/{id}/verify + */ + public function verifyLine($kodcaw, $id, Request $request) + { + return $this->respond($this->service->verifyLine( + $kodcaw, + $id, + $request->input('pc_verified_by', '') + )); + } + + /** + * POST /api/pembiayaan-online/{kodcaw}/lines/{id}/unverify + */ + public function unverifyLine($kodcaw, $id) + { + return $this->respond($this->service->unverifyLine($kodcaw, $id)); + } + /** * GET /api/pembiayaan-online/{kodcaw}/batches */ @@ -177,6 +206,14 @@ class PembiayaanOnlineController extends Controller return $this->respond($this->service->getBukti($kodcaw, $id)); } + /** + * GET /api/pembiayaan-online/{kodcaw}/lines/{id}/bukti-akaun + */ + public function getBuktiAkaun($kodcaw, $id) + { + return $this->respond($this->service->getBuktiAkaun($kodcaw, $id)); + } + /** * GET /api/pembiayaan-online/{kodcaw}/paid?blast_sent=0 */ diff --git a/app/Http/Controllers/TebusController.php b/app/Http/Controllers/TebusController.php index 512ccd8..90ced88 100644 --- a/app/Http/Controllers/TebusController.php +++ b/app/Http/Controllers/TebusController.php @@ -20,6 +20,7 @@ use App\Panjar; use App\HargaEmas; use App\Moratorium; use App\Audit; +use App\Feature; use App\LookupWakil; use App\StokAudit1; @@ -193,7 +194,7 @@ class TebusController extends Controller $cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$kodcaw)->first(); $tebus_data = Tebus::on($cawangan['mysql']) - ->select('tebus.t_tebus', 'gad.t_gadai','gad.hargajualan','gad.bakihargajualan','gad.bakipjm as gadaibakipjm','tebus.nilaimarhun','tebus.tagterima', 'tebus.teller','tebus.jenistebus','tebus.pinjaman','tebus.bakiupah','tebus.bakipjm','gad.norujukan','gad.nokp','tebus.jbg','tebus.ujrah','tebus.onepercent','gad.tagbaru') + ->select('tebus.t_tebus', 'gad.t_gadai','gad.hargajualan','gad.bakihargajualan','gad.bakipjm as gadaibakipjm','tebus.nilaimarhun','tebus.tagterima', 'tebus.teller','tebus.jenistebus','tebus.pinjaman','tebus.bakiupah','tebus.bakipjm','gad.norujukan','gad.nokp','tebus.jbg','tebus.ujrah','tebus.onepercent','gad.tagbaru','tebus.diskaun_rebate') ->join('gadai as gad','gad.norujukan','=','tebus.norujukan') // ->join('online_arrahn.customer as cust', function($join) // { @@ -232,7 +233,8 @@ class TebusController extends Controller "nokp"=>$tebusData['nokp'], "jbg"=>$tebusData['jbg'], "ujrah"=>$trans['ujrah_rebet'], - "onepercent"=>$trans['onepercent_rebet'] + "onepercent"=>$trans['onepercent_rebet'], + "diskaun_rebate"=>$tebusData['diskaun_rebate'], ]); } @@ -274,7 +276,8 @@ class TebusController extends Controller 'tebus.jbg', 'tebus.ujrah', 'tebus.onepercent', - 'gad.tagbaru' + 'gad.tagbaru', + 'tebus.diskaun_rebate' ) ->join('gadai as gad', 'gad.norujukan', '=', 'tebus.norujukan') ->where('tebus.t_tebus', '>=', $request->mula) @@ -310,7 +313,8 @@ class TebusController extends Controller "jbg"=>$tebusData['jbg'], "ujrah"=>$trans['ujrah_rebet'], "onepercent"=>$trans['onepercent_rebet'], - "tagbaru"=>$tebusData['tagbaru'] + "tagbaru"=>$tebusData['tagbaru'], + "diskaun_rebate"=>$tebusData['diskaun_rebate'], ]); } @@ -1672,6 +1676,53 @@ class TebusController extends Controller return response($rebet); } + public function RebetPromoCalculation($kodcaw, Request $request) + { + $kodcaw = $request->kodcaw ?: $kodcaw; + if (!Feature::enabled($kodcaw, Feature::REBET_ANNUR)) { + return response(0); + } + + $cawangan = Cawangan::on('mysql7')->where('kodcaw', '=', $kodcaw)->first(); + + $rebet = Tebus::on($cawangan['mysql']) + ->join('gadai as db2', 'tebus.norujukan', '=', 'db2.norujukan') + ->where('tebus.t_tebus', '<=', $request->tarikh) + ->where('db2.hargajualan', '>', '0') + ->whereNotNull('db2.hargajualan') + ->sum('diskaun_rebate'); + + return response($rebet); + } + + public function PelarasanRebate($kodcaw, Request $request) + { + $kodcaw = $request->kodcaw ?: $kodcaw; + if (!Feature::enabled($kodcaw, Feature::REBET_ANNUR)) { + return response(0); + } + + $cawangan = Cawangan::on('mysql7') + ->where('kodcaw', $kodcaw) + ->first(); + + $tarikhLaporan = Carbon::parse($request->tarikh)->toDateString(); + $tarikhTamatPelarasan = '2026-09-02'; + $tarikhAkhir = $tarikhLaporan > $tarikhTamatPelarasan + ? $tarikhTamatPelarasan + : $tarikhLaporan; + + $rebet = Tebus::on($cawangan['mysql']) + ->join('gadai as db2', 'tebus.norujukan', '=', 'db2.norujukan') + ->whereDate('tebus.t_tebus', '>=', '2025-05-13') + ->whereDate('tebus.t_tebus', '<=', $tarikhAkhir) + ->where('db2.hargajualan', '>', 0) + ->whereDate('db2.t_gadai', '>', '2023-05-21') + ->sum('tebus.diskaun_rebate'); + + return response($rebet); + } + public function RebetCalculationLejer($kodcaw,Request $request) { $cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$request->kodcaw)->first(); @@ -1687,6 +1738,26 @@ class TebusController extends Controller return response($rebet); } + public function RebetPromoCalculationLejer($kodcaw, Request $request) + { + $kodcaw = $request->kodcaw ?: $kodcaw; + if (!Feature::enabled($kodcaw, Feature::REBET_ANNUR)) { + return response(0); + } + + $cawangan = Cawangan::on('mysql7')->where('kodcaw', '=', $kodcaw)->first(); + + $rebet = Tebus::on($cawangan['mysql']) + ->join('gadai as db2', 'tebus.norujukan', '=', 'db2.norujukan') + ->where('tebus.t_tebus', '>=', $request->mula) + ->where('tebus.t_tebus', '<=', $request->hingga) + ->where('db2.hargajualan', '>', '0') + ->whereNotNull('db2.hargajualan') + ->sum('diskaun_rebate'); + + return response($rebet); + } + public function getUpahLamaToday($kodcaw,$norujukan) { $current = Carbon::now(); diff --git a/app/Http/Controllers/TunaiController.php b/app/Http/Controllers/TunaiController.php index 12d0fba..05e55b9 100644 --- a/app/Http/Controllers/TunaiController.php +++ b/app/Http/Controllers/TunaiController.php @@ -13,6 +13,7 @@ use App\Vault; use Auth0\SDK\API\Management\Users; use Illuminate\Http\Request; use Carbon\Carbon; +use App\Services\StaffNotificationClient; use Illuminate\Support\Facades\Log; class TunaiController extends Controller { @@ -476,10 +477,54 @@ class TunaiController extends Controller $audit->updated_at = $current; $audit->save(); + $this->notifyKhazanahAliranTunai($kodcaw, $request, $reqteller); return response()->json($reqteller,200); } + /** + * Inbox for PC/PPC at the branch. Failures must not block the request. + * + * @param string $kodcaw + * @param \Illuminate\Http\Request $request + * @param \App\RequestTeller $reqteller + * @return void + */ + protected function notifyKhazanahAliranTunai($kodcaw, Request $request, $reqteller) + { + try { + $cawangan = Cawangan::on('mysql7')->where('kodcaw', '=', $kodcaw)->first(); + $namaCaw = $kodcaw; + if ($cawangan) { + $nama = trim((string) $cawangan->nama_cawangan); + if ($nama !== '') { + $namaCaw = $nama; + } + } + + $modal = (float) $request->modal; + $serahan = (float) $request->serahan; + + app(StaffNotificationClient::class)->notify([ + 'type' => 'aliran_tunai.pending_khazanah', + 'cawangan' => $kodcaw, + 'audience' => ['role' => 'pc'], + 'data' => [ + 'request_no' => isset($reqteller->no) ? $reqteller->no : null, + 'kodlaluan' => $request->kodlaluan, + 'modal' => $modal, + 'serahan' => $serahan, + 'cawangan_nama' => $namaCaw, + ], + ]); + } catch (\Throwable $e) { + Log::warning('Aliran tunai khazanah notification failed: '.$e->getMessage(), [ + 'kodcaw' => $kodcaw, + 'kodlaluan' => $request->kodlaluan, + ]); + } + } + public function getTunaiSemalam($kodcaw) { $current = new Carbon(); diff --git a/app/Http/Controllers/VaultController.php b/app/Http/Controllers/VaultController.php index 03490f9..3aa36db 100644 --- a/app/Http/Controllers/VaultController.php +++ b/app/Http/Controllers/VaultController.php @@ -12,6 +12,7 @@ use App\GlDetail; use App\imbangdugalama; use App\GlCode; use App\Panjar; +use App\ModalOnline; use Illuminate\Http\Request; use Carbon\Carbon; @@ -168,37 +169,64 @@ class VaultController extends Controller return response()->json($updateVault, 200); } - public function updateVaultDeletePendahuluanSerahan($kodcaw, Request $request) - { - $current = Carbon::now(); - $current = new Carbon(); - $cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$kodcaw)->first(); - $vault=Vault::on($cawangan['mysql'])->where('kodcaw','=',$kodcaw)->where('tarikh','=',$current->toDateString())->orderby('tarikh','desc')->first(); +public function updateVaultDeletePendahuluanSerahan($kodcaw, Request $request) +{ + $current = new Carbon(); - $bakiawal = $vault['bakiawal']; - $keluar = $vault['keluar']; - $masuk = $vault['masuk']; - $bakiakhir = $vault['bakiakhir']; - $bakieod = $vault['bakieod']; - $pendahuluan = $vault['pendahuluan']; - $serahan = $vault['serahan']; - $totpanjaran = $vault['totpanjar']; + $cawangan = Cawangan::on('mysql7')->where('kodcaw', '=', $kodcaw)->first(); - $glpend = GlDetail::on($cawangan['mysql'])->where('tarikh','=', $current->toDateString())->sum('pendahuluan'); - $glser = GlDetail::on($cawangan['mysql'])->where('tarikh','=', $current->toDateString())->where('teller','<>','ONLINE')->sum('serahan'); + if (!$cawangan) { + return response()->json(['message' => 'Cawangan tidak dijumpai'], 404); + } - $bakiakhir = $bakiawal - $keluar + $masuk + $glpend - $glser - $totpanjaran; + $vault = Vault::on($cawangan['mysql']) + ->where('kodcaw', '=', $kodcaw) + ->where('tarikh', '=', $current->toDateString()) + ->first(); - $updateVault=Vault::on($cawangan['mysql'])->where([['tarikh','=',$current->toDateString()],['kodcaw','=', $kodcaw]])->update(array( - 'pendahuluan' => $glpend, - 'serahan' => $glser, - 'bakiakhir'=>$bakiakhir, - 'bakieod'=>$bakiakhir - )); + if (!$vault) { + return response()->json(['message' => 'Rekod vault hari ini tidak dijumpai'], 404); + } - return response()->json($updateVault, 200); - } + $bakiawal = $vault['bakiawal']; + $keluar = $vault['keluar']; + $masuk = $vault['masuk']; + $totpanjaran = $vault['totpanjar']; + + // Pendahuluan HQ (dari GL) + $glpend = GlDetail::on($cawangan['mysql']) + ->where('tarikh', '=', $current->toDateString()) + ->sum('pendahuluan'); + + // Serahan (GL, exclude teller ONLINE) + $glser = GlDetail::on($cawangan['mysql']) + ->where('tarikh', '=', $current->toDateString()) + ->where('teller', '<>', 'ONLINE') + ->sum('serahan'); + + // Pendahuluan Online (had yang diluluskan hari ini) + $modalOnlineHad = ModalOnline::on($cawangan['mysql']) + ->where('kodcaw', '=', $kodcaw) + ->where('tarikh', '=', $current->toDateString()) + ->value('had') ?? 0; + + // Gabungan pendahuluan HQ + pendahuluan online + $totalPendahuluan = $glpend + $modalOnlineHad; + + $bakiakhir = $bakiawal - $keluar + $masuk + $totalPendahuluan - $glser - $totpanjaran; + + $updateVault = Vault::on($cawangan['mysql']) + ->where([['tarikh', '=', $current->toDateString()], ['kodcaw', '=', $kodcaw]]) + ->update([ + 'pendahuluan' => $totalPendahuluan, + 'serahan' => $glser, + 'bakiakhir' => $bakiakhir, + 'bakieod' => $bakiakhir, + ]); + + return response()->json($updateVault, 200); +} public function create($kodcaw,Request $request) { @@ -481,25 +509,24 @@ class VaultController extends Controller } public function CalculationPendahuluanSerahan($kodcaw,Request $request) - { - $cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$kodcaw)->first(); +{ + $cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$kodcaw)->first(); - $serahanpkb = '1000/020'; - $serahanjmc = '1000/026'; - $pendahuluanpkb = '7000/102'; - $pendahuluanjmc = '7000/106'; - $serahankoperasi = '1000/090'; + $serahanpkb = '1000/020'; + $serahanjmc = '1000/026'; + $pendahuluanpkb = '7000/102'; + $pendahuluanjmc = '7000/106'; + $serahankoperasi = '1000/090'; - //Selepas Tawarruq + //Selepas Tawarruq - $serahanpkbTawarruq = GlDetail::on($cawangan['mysql']) - ->where('ktacct','=',$serahanpkb) - ->where('tarikh','<=', $request->tarikh) - ->where('tarikh','>','2021-03-24') - ->sum('serahan'); + $serahanpkbTawarruq = GlDetail::on($cawangan['mysql']) + ->where('ktacct','=',$serahanpkb) + ->where('tarikh','<=', $request->tarikh) + ->where('tarikh','>','2021-03-24') + ->sum('serahan'); - - //Sebelum Tawarruq + //Sebelum Tawarruq if($kodcaw == 'KB2' || $kodcaw == 'WCY' || $kodcaw == '1STOP' || $kodcaw == 'ARM' || $kodcaw == 'APM' || $kodcaw == '010621' || $kodcaw == '010915' || $kodcaw == '020303') { $serahanpkb = GlDetail::on($cawangan['mysql']) @@ -546,47 +573,53 @@ class VaultController extends Controller - //Selepas Tawarruq + //Selepas Tawarruq - $pendahuluanPKBtawarruq = GlDetail::on($cawangan['mysql']) + $pendahuluanPKBtawarruq = GlDetail::on($cawangan['mysql']) ->where('ktacct','=',$pendahuluanpkb) ->where([['tarikh','<=', $request->tarikh],['tarikh','>','2021-03-24']]) ->sum('pendahuluan'); - //Sebelum Tawarruq + //Sebelum Tawarruq - $pendahuluanPKB = GlDetail::on($cawangan['mysql']) - ->where('ktacct','=',$pendahuluanpkb) - ->where([['tarikh','<=', $request->tarikh],['tarikh','>','2013-12-31']]) - ->sum('amaun'); - - $pendahuluanJMC = GlDetail::on($cawangan['mysql']) - ->where('ktacct','=','7000/106') - ->where([['tarikh','<=', $request->tarikh],['tarikh','>','2013-12-31']]) - ->sum('amaun'); - - $pendahuluanpkblama = imbangdugalama::on($cawangan['mysql']) - ->sum('pendahuluan_pkb'); - - $pendahuluanjmclama = imbangdugalama::on($cawangan['mysql']) - ->sum('pendahuluan_jmc'); - - $total = $pendahuluanPKBtawarruq + $pendahuluanjmclama + $pendahuluanpkblama + $pendahuluanPKB + $pendahuluanJMC; - - $pindahkekpkb = GlCode::on($cawangan['mysql']) - ->where('glcode','=',$serahankoperasi) + $pendahuluanPKB = GlDetail::on($cawangan['mysql']) + ->where('ktacct','=',$pendahuluanpkb) + ->where([['tarikh','<=', $request->tarikh],['tarikh','>','2013-12-31']]) ->sum('amaun'); - if($kodcaw == '011229') - $totalserahan -= 0.10; + $pendahuluanJMC = GlDetail::on($cawangan['mysql']) + ->where('ktacct','=','7000/106') + ->where([['tarikh','<=', $request->tarikh],['tarikh','>','2013-12-31']]) + ->sum('amaun'); - if($kodcaw == '011013') - $totalserahan += 641000; + $pendahuluanpkblama = imbangdugalama::on($cawangan['mysql']) + ->sum('pendahuluan_pkb'); - $arraypend = ['pendahuluan' => $total,'serahan' => $totalserahan,'pindahkekpkb' => $pindahkekpkb]; + $pendahuluanjmclama = imbangdugalama::on($cawangan['mysql']) + ->sum('pendahuluan_jmc'); - return response()->json($arraypend); - } + //Pendahuluan Online (had) + $modalOnlineHad = ModalOnline::on($cawangan['mysql']) + ->where('kodcaw','=', $kodcaw) + ->where('tarikh','=', $request->tarikh) + ->value('had') ?? 0; + + $total = $pendahuluanPKBtawarruq + $pendahuluanjmclama + $pendahuluanpkblama + $pendahuluanPKB + $pendahuluanJMC + $modalOnlineHad; + + $pindahkekpkb = GlCode::on($cawangan['mysql']) + ->where('glcode','=',$serahankoperasi) + ->sum('amaun'); + + if($kodcaw == '011229') + $totalserahan -= 0.10; + + if($kodcaw == '011013') + $totalserahan += 641000; + + $arraypend = ['pendahuluan' => $total,'serahan' => $totalserahan,'pindahkekpkb' => $pindahkekpkb]; + + return response()->json($arraypend); +} public function CalculationPendahuluanSerahanLejer($kodcaw,Request $request) @@ -732,5 +765,19 @@ class VaultController extends Controller return response()->json($vault); } +public function CalculationModalOnlineLejer($kodcaw, Request $request) +{ + $cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$kodcaw)->first(); + $tarikh = $request->hingga; + + $modal_online = ModalOnline::on($cawangan['mysql']) + ->where('kodcaw', '=', $kodcaw) + ->where('tarikh', '=', $tarikh) + ->first(); + + return response()->json([ + 'had' => $modal_online ? floatval($modal_online->had) : 0, + ]); +} } diff --git a/app/Http/Controllers/WhatsappWebhookController.php b/app/Http/Controllers/WhatsappWebhookController.php new file mode 100644 index 0000000..11b4f40 --- /dev/null +++ b/app/Http/Controllers/WhatsappWebhookController.php @@ -0,0 +1,122 @@ +query('hub_mode', $request->query('hub.mode')); + $token = $request->query('hub_verify_token', $request->query('hub.verify_token')); + $challenge = $request->query('hub_challenge', $request->query('hub.challenge')); + + $expected = (string) config('whatsapp.verify_token'); + + if ($mode === 'subscribe' && $expected !== '' && hash_equals($expected, (string) $token)) { + Log::info('WhatsApp webhook verified'); + return response((string) $challenge, 200) + ->header('Content-Type', 'text/plain'); + } + + Log::warning('WhatsApp webhook verify failed', [ + 'mode' => $mode, + 'token_match' => $expected !== '' && hash_equals($expected, (string) $token), + ]); + + return response('Forbidden', 403); + } + + /** + * POST /api/whatsapp/webhook + * Acknowledge quickly; optionally check X-Hub-Signature-256 when app secret is set. + */ + public function handle(Request $request) + { + $raw = $request->getContent(); + + if (!$this->signatureOk($request, $raw)) { + Log::warning('WhatsApp webhook invalid signature'); + return response('Invalid signature', 403); + } + + $payload = json_decode($raw, true); + if (!is_array($payload)) { + return response('OK', 200); + } + + try { + $this->logEvents($payload); + } catch (\Throwable $e) { + Log::error('WhatsApp webhook log failed: ' . $e->getMessage()); + } + + return response('OK', 200); + } + + protected function signatureOk(Request $request, $raw) + { + $secret = trim((string) config('whatsapp.app_secret')); + if ($secret === '') { + return true; + } + + $header = (string) $request->header('X-Hub-Signature-256', ''); + if ($header === '' || strpos($header, 'sha256=') !== 0) { + return false; + } + + $expected = 'sha256=' . hash_hmac('sha256', $raw, $secret); + + return hash_equals($expected, $header); + } + + protected function logEvents(array $payload) + { + $entries = $payload['entry'] ?? []; + if (!is_array($entries)) { + return; + } + + foreach ($entries as $entry) { + $changes = $entry['changes'] ?? []; + if (!is_array($changes)) { + continue; + } + + foreach ($changes as $change) { + $value = $change['value'] ?? []; + if (!is_array($value)) { + continue; + } + + foreach ($value['statuses'] ?? [] as $status) { + Log::info('WhatsApp status', [ + 'id' => $status['id'] ?? null, + 'status' => $status['status'] ?? null, + 'recipient' => $status['recipient_id'] ?? null, + 'errors' => $status['errors'] ?? null, + ]); + } + + foreach ($value['messages'] ?? [] as $message) { + Log::info('WhatsApp inbound', [ + 'from' => $message['from'] ?? null, + 'type' => $message['type'] ?? null, + 'id' => $message['id'] ?? null, + ]); + } + } + } + } +} diff --git a/app/Http/Middleware/LogViewerPassword.php b/app/Http/Middleware/LogViewerPassword.php new file mode 100644 index 0000000..f43d2c4 --- /dev/null +++ b/app/Http/Middleware/LogViewerPassword.php @@ -0,0 +1,32 @@ +header('Cache-Control', 'no-store'); + } + + $provided = $request->getPassword(); + if ($request->getUser() !== 'logviewer' || !is_string($provided) || + !password_verify($provided, $passwordHash)) { + return response('Kata laluan diperlukan untuk mengakses log.', 401, [ + 'WWW-Authenticate' => 'Basic realm="Log Viewer", charset="UTF-8"', + 'Cache-Control' => 'no-store', + ]); + } + + $response = $next($request); + $response->headers->set('Cache-Control', 'no-store'); + + return $response; + } +} diff --git a/app/Jobs/WhatsappPembiayaanOnlinePaid.php b/app/Jobs/WhatsappPembiayaanOnlinePaid.php new file mode 100644 index 0000000..466e449 --- /dev/null +++ b/app/Jobs/WhatsappPembiayaanOnlinePaid.php @@ -0,0 +1,153 @@ +kodcaw = $data['kodcaw'] ?? null; + $this->cawName = $data['caw_name'] ?? null; + $this->nokp = $data['nokp'] ?? null; + $this->norujukan = $data['norujukan'] ?? null; + $this->pinjaman = $data['pinjaman'] ?? null; + $this->namaBank = $data['nama_bank'] ?? null; + $this->noakaun = $data['noakaun'] ?? null; + $this->tarikhBayaran = $data['tarikh_bayaran'] ?? null; + $this->noRujukanBayaran = $data['no_rujukan_bayaran'] ?? null; + } + + public function handle() + { + $client = new WhatsappCloudClient(); + $now = Carbon::now(); + + if (!$client->isConfigured()) { + Log::warning('WhatsApp Cloud skipped: token or phone_number_id missing', [ + 'norujukan' => $this->norujukan, + ]); + return; + } + + $customer = Customer::on('mysql7') + ->where(function ($q) { + $q->where('kpbaru', $this->nokp)->orWhere('kplama', $this->nokp); + }) + ->first(); + + $storedPhone = $customer ? ($customer->telefon ?: $customer->telefon2) : null; + $to = $client->normalizeMsisdn($storedPhone); + + if (!config('whatsapp.whatsapp_cloud_enabled')) { + $admin = $client->normalizeMsisdn(env('ADMIN_PHONE_NUMBER')); + if (!$admin) { + Log::warning('WhatsApp Cloud skipped: ADMIN_PHONE_NUMBER required when WHATSAPP_ENABLED is false', [ + 'norujukan' => $this->norujukan, + ]); + $this->logBlast($now, $storedPhone, 'skipped: ADMIN_PHONE_NUMBER empty'); + return; + } + $to = $admin; + } + + if (!$to) { + Log::warning('WhatsApp Cloud skipped: no phone', [ + 'nokp' => $this->nokp, + 'norujukan' => $this->norujukan, + ]); + $this->logBlast($now, $storedPhone, 'skipped: no phone'); + return; + } + + $template = config('whatsapp.template', 'hello_world'); + $lang = config('whatsapp.template_lang', 'en_US'); + $bodyParams = $this->isHelloWorld($template) ? [] : $this->bodyParams(); + + try { + $response = $client->sendTemplate($to, $template, $lang, $bodyParams); + $this->logBlast($now, $to, $response->body()); + } catch (\Throwable $e) { + Log::error('WhatsappPembiayaanOnlinePaid failed: ' . $e->getMessage(), [ + 'norujukan' => $this->norujukan, + ]); + $this->logBlast($now, $to, 'exception: ' . $e->getMessage()); + } + } + + protected function isHelloWorld($template) + { + return strtolower((string) $template) === 'hello_world'; + } + + /** + * Matches Meta template pembiayaan_online_paid (ms): + * AR-RAHN KoPKB: Pembiayaan bagi No. SAG *{{1}}* sebanyak *RM{{2}}* + * telah berjaya dikreditkan ke akaun *{{3}}* berakhir *{{4}}* pada *{{5}}*. + * Rujukan: *{{6}}* + * + * {{1}} SAG, {{2}} amaun, {{3}} nama bank/akaun, {{4}} 4 digit akhir, {{5}} tarikh, {{6}} rujukan bayaran + * + * @return array + */ + protected function bodyParams() + { + $bank = trim((string) $this->namaBank); + $tail = $this->accountTail($this->noakaun); + + $tarikh = $this->tarikhBayaran + ? Carbon::parse($this->tarikhBayaran)->format('d/m/Y') + : Carbon::now()->format('d/m/Y'); + + return [ + $this->norujukan ?: '-', + number_format((float) $this->pinjaman, 2, '.', ''), + $bank !== '' ? $bank : '-', + $tail !== '' ? $tail : '-', + $tarikh, + $this->noRujukanBayaran ?: '-', + ]; + } + + protected function accountTail($noakaun) + { + $digits = preg_replace('/\D+/', '', (string) $noakaun); + if ($digits === '') { + return ''; + } + + return substr($digits, -4); + } + + protected function logBlast($now, $telefon, $status) + { + try { + $log = new BlastWasap(); + $log->kodcaw = $this->kodcaw; + $log->nokp = $this->nokp; + $log->notelefon = $telefon; + $log->norujukan = $this->norujukan; + $log->status = is_string($status) ? $status : json_encode($status); + $log->created_at = $now; + $log->updated_at = $now; + $log->save(); + } catch (\Throwable $e) { + Log::error('log_blast_wasap save failed: ' . $e->getMessage()); + } + } +} diff --git a/app/KadarRebet.php b/app/KadarRebet.php new file mode 100644 index 0000000..e1cd20d --- /dev/null +++ b/app/KadarRebet.php @@ -0,0 +1,18 @@ + $nota, ]); + $this->notifyOperasiModalRequest($kodcaw, $request, $jenis); + return [ 'ok' => true, 'status' => 201, @@ -373,6 +376,54 @@ class ModalOnlineService ]; } + /** + * Inbox for all operasi staff. Failures must not block the request. + * + * @param string $kodcaw + * @param \App\RequestModalOnline $request + * @param string $jenis + * @return void + */ + protected function notifyOperasiModalRequest($kodcaw, $request, $jenis) + { + try { + app(StaffNotificationClient::class)->notify([ + 'type' => 'modal_online.pending_operasi', + 'cawangan' => $kodcaw, + 'audience' => ['role' => 'operasi'], + 'data' => [ + 'request_id' => $request->id, + 'amaun' => (float) $request->amaun, + 'dimohon_oleh' => $request->dimohon_oleh, + 'jenis' => $jenis, + 'nota' => $request->nota, + 'cawangan_nama' => $this->cawanganNama($kodcaw), + ], + ]); + } catch (\Throwable $e) { + Log::warning('Operasi modal-online notification failed: '.$e->getMessage(), [ + 'kodcaw' => $kodcaw, + 'request_id' => $request->id, + ]); + } + } + + /** + * @param string $kodcaw + * @return string + */ + protected function cawanganNama($kodcaw) + { + $cawangan = Cawangan::on('mysql7')->where('kodcaw', '=', $kodcaw)->first(); + if (!$cawangan) { + return $kodcaw; + } + + $nama = trim((string) $cawangan->nama_cawangan); + + return $nama !== '' ? $nama : $kodcaw; + } + /** * List top-up requests. * For PC: pass kodcaw. For Operasi: omit kodcaw (all branches). diff --git a/app/Services/PembiayaanOnline/PembiayaanOnlineService.php b/app/Services/PembiayaanOnline/PembiayaanOnlineService.php index abd0231..4151106 100644 --- a/app/Services/PembiayaanOnline/PembiayaanOnlineService.php +++ b/app/Services/PembiayaanOnline/PembiayaanOnlineService.php @@ -9,16 +9,21 @@ use App\Cawangan; use App\Customer; use App\Feature; use App\Gadai; +use App\Jobs\WhatsappPembiayaanOnlinePaid; use App\PembiayaanOnline; +use App\Services\StaffNotificationClient; +use App\Services\Whatsapp\WhatsappCloudClient; use Carbon\Carbon; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; class PembiayaanOnlineService { - const MIN_PINJAMAN = 5000.00; + const MIN_PINJAMAN = 1.00; const MAX_PINJAMAN = 50000.00; - const PC_QUEUE_STATUSES = ['PENDING_PC', 'REJECTED_PC']; + const PC_QUEUE_STATUSES = ['PENDING_PC', 'REJECTED_PC', 'VERIFIED_PC']; + const PC_VERIFY_FROM_STATUSES = ['PENDING_PC', 'REJECTED_PC']; + const PC_SUBMITTABLE_STATUSES = ['VERIFIED_PC']; protected $modalOnlineService; @@ -258,6 +263,36 @@ class PembiayaanOnlineService ]; } + /** + * @return array{ok:bool,status:int,payload:mixed} + */ + public function showLine($kodcaw, $id) + { + $resolved = $this->resolveMysql($kodcaw); + if (!$resolved['ok']) { + return $resolved; + } + + $line = PembiayaanOnline::on($resolved['mysql']) + ->where('kodcaw', $kodcaw) + ->where('id', $id) + ->first(); + + if (!$line) { + return [ + 'ok' => false, + 'status' => 404, + 'payload' => ['message' => 'Pembiayaan online tidak dijumpai'], + ]; + } + + return [ + 'ok' => true, + 'status' => 200, + 'payload' => $line, + ]; + } + /** * @return array{ok:bool,status:int,payload:mixed} */ @@ -332,7 +367,7 @@ class PembiayaanOnlineService 'ok' => false, 'status' => 422, 'payload' => [ - 'message' => 'Hanya rekod PENDING_PC / REJECTED_PC boleh dikemaskini', + 'message' => 'Hanya rekod PENDING_PC / REJECTED_PC / VERIFIED_PC boleh dikemaskini', 'status' => $line->status, ], ]; @@ -368,6 +403,18 @@ class PembiayaanOnlineService $fields['borang_file_id'] = $input['borang_file_id']; } + if (!empty($input['bukti_akaun_data'])) { + $saved = $this->storeBuktiFile([ + 'data' => $input['bukti_akaun_data'], + 'filename' => $input['bukti_akaun_filename'] ?? $input['filename'] ?? null, + 'type' => $input['bukti_akaun_type'] ?? $input['type'] ?? null, + ]); + if (!$saved['ok']) { + return $saved; + } + $fields['bukti_akaun_file_id'] = $saved['payload']['id']; + } + if (empty($fields)) { return [ 'ok' => false, @@ -395,6 +442,12 @@ class PembiayaanOnlineService ? (bool) $input['update_customer_bank'] : true; + if ($line->status === 'VERIFIED_PC') { + $fields['status'] = !empty($line->reject_reason) ? 'REJECTED_PC' : 'PENDING_PC'; + $fields['pc_verified_by'] = null; + $fields['pc_verified_at'] = null; + } + try { DB::connection($mysql)->transaction(function () use ($mysql, $line, $fields, $updateCustomerBank) { PembiayaanOnline::on($mysql)->where('id', $line->id)->update($fields); @@ -433,6 +486,159 @@ class PembiayaanOnlineService } } + /** + * PC confirms one queue line before it can be submitted to Operasi. + * + * @return array{ok:bool,status:int,payload:mixed} + */ + public function verifyLine($kodcaw, $id, $pcBy) + { + $resolved = $this->resolveMysql($kodcaw); + if (!$resolved['ok']) { + return $resolved; + } + $mysql = $resolved['mysql']; + + $pcBy = trim((string) $pcBy); + if ($pcBy === '') { + return [ + 'ok' => false, + 'status' => 422, + 'payload' => ['message' => 'pc_verified_by diperlukan'], + ]; + } + + try { + return DB::connection($mysql)->transaction(function () use ($mysql, $kodcaw, $id, $pcBy) { + $line = PembiayaanOnline::on($mysql) + ->where('kodcaw', $kodcaw) + ->where('id', $id) + ->lockForUpdate() + ->first(); + + if (!$line) { + return [ + 'ok' => false, + 'status' => 404, + 'payload' => ['message' => 'Pembiayaan online tidak dijumpai'], + ]; + } + + if ($line->status === 'VERIFIED_PC') { + return [ + 'ok' => true, + 'status' => 200, + 'payload' => $line, + ]; + } + + if (!in_array($line->status, self::PC_VERIFY_FROM_STATUSES, true)) { + return [ + 'ok' => false, + 'status' => 422, + 'payload' => [ + 'message' => 'Hanya rekod PENDING_PC / REJECTED_PC boleh disemak', + 'status' => $line->status, + ], + ]; + } + + if (empty($line->kodbank) || empty($line->noakaun)) { + return [ + 'ok' => false, + 'status' => 422, + 'payload' => [ + 'message' => 'Maklumat bank tidak lengkap. Kemaskini bank sebelum semak.', + 'id' => $line->id, + 'norujukan' => $line->norujukan, + ], + ]; + } + + PembiayaanOnline::on($mysql)->where('id', $line->id)->update([ + 'status' => 'VERIFIED_PC', + 'pc_verified_by' => $pcBy, + 'pc_verified_at' => Carbon::now(), + ]); + + return [ + 'ok' => true, + 'status' => 200, + 'payload' => PembiayaanOnline::on($mysql)->where('id', $line->id)->first(), + ]; + }); + } catch (\Throwable $e) { + Log::error('PembiayaanOnline verifyLine failed: ' . $e->getMessage()); + return [ + 'ok' => false, + 'status' => 500, + 'payload' => ['message' => 'Gagal semak pembiayaan online'], + ]; + } + } + + /** + * Undo PC verification so the line must be checked again. + * + * @return array{ok:bool,status:int,payload:mixed} + */ + public function unverifyLine($kodcaw, $id) + { + $resolved = $this->resolveMysql($kodcaw); + if (!$resolved['ok']) { + return $resolved; + } + $mysql = $resolved['mysql']; + + try { + return DB::connection($mysql)->transaction(function () use ($mysql, $kodcaw, $id) { + $line = PembiayaanOnline::on($mysql) + ->where('kodcaw', $kodcaw) + ->where('id', $id) + ->lockForUpdate() + ->first(); + + if (!$line) { + return [ + 'ok' => false, + 'status' => 404, + 'payload' => ['message' => 'Pembiayaan online tidak dijumpai'], + ]; + } + + if ($line->status !== 'VERIFIED_PC') { + return [ + 'ok' => false, + 'status' => 422, + 'payload' => [ + 'message' => 'Hanya rekod VERIFIED_PC boleh dibatalkan semakan', + 'status' => $line->status, + ], + ]; + } + + PembiayaanOnline::on($mysql)->where('id', $line->id)->update([ + 'status' => !empty($line->reject_reason) ? 'REJECTED_PC' : 'PENDING_PC', + 'pc_verified_by' => null, + 'pc_verified_at' => null, + ]); + + return [ + 'ok' => true, + 'status' => 200, + 'payload' => PembiayaanOnline::on($mysql)->where('id', $line->id)->first(), + ]; + }); + } catch (\Throwable $e) { + Log::error('PembiayaanOnline unverifyLine failed: ' . $e->getMessage()); + return [ + 'ok' => false, + 'status' => 500, + 'payload' => ['message' => 'Gagal batal semakan pembiayaan online'], + ]; + } + } + /** * @return array{ok:bool,status:int,payload:mixed} */ @@ -544,7 +750,7 @@ class PembiayaanOnlineService $tarikh = $now->toDateString(); try { - return DB::connection($mysql)->transaction(function () use ( + $result = DB::connection($mysql)->transaction(function () use ( $mysql, $kodcaw, $ids, @@ -573,12 +779,12 @@ class PembiayaanOnlineService } foreach ($lines as $line) { - if (!in_array($line->status, self::PC_QUEUE_STATUSES, true)) { + if (!in_array($line->status, self::PC_SUBMITTABLE_STATUSES, true)) { return [ 'ok' => false, 'status' => 422, 'payload' => [ - 'message' => 'Rekod bukan dalam queue PC', + 'message' => 'Rekod belum disemak PC. Sahkan satu-satu sebelum hantar ke Operasi.', 'id' => $line->id, 'norujukan' => $line->norujukan, 'status' => $line->status, @@ -652,6 +858,127 @@ class PembiayaanOnlineService 'payload' => ['message' => 'Gagal hantar batch pembiayaan online'], ]; } + + if (!empty($result['ok'])) { + $this->notifyOperasiBatchSubmitted($kodcaw, $ids, $pcBy, $result['payload']); + } + + return $result; + } + + /** + * Inbox for all operasi staff after PC submit. Failures must not block the batch. + * + * @param string $kodcaw + * @param array $ids + * @param string $pcBy + * @param array $payload + * @return void + */ + protected function notifyOperasiBatchSubmitted($kodcaw, array $ids, $pcBy, array $payload) + { + $batch = isset($payload['batch']) ? $payload['batch'] : null; + if (!$batch) { + return; + } + + $batchId = is_array($batch) ? ($batch['id'] ?? null) : $batch->id; + $batchNo = is_array($batch) ? ($batch['batch_no'] ?? '') : $batch->batch_no; + $slot = is_array($batch) ? ($batch['slot'] ?? '') : $batch->slot; + $bilangan = is_array($batch) ? ($batch['bilangan'] ?? 0) : $batch->bilangan; + $jumlah = is_array($batch) ? ($batch['jumlah_keseluruhan'] ?? 0) : $batch->jumlah_keseluruhan; + + if (!$batchId) { + return; + } + + try { + app(StaffNotificationClient::class)->notify([ + 'type' => 'pembiayaan_online.batch_operasi', + 'cawangan' => $kodcaw, + 'audience' => ['role' => 'operasi'], + 'data' => [ + 'batch_id' => $batchId, + 'batch_no' => $batchNo, + 'slot' => $slot, + 'appended' => !empty($payload['appended']), + 'submitted_count' => count($ids), + 'bilangan' => $bilangan, + 'jumlah_keseluruhan' => (float) $jumlah, + 'pc_submitted_by' => $pcBy, + 'cawangan_nama' => $this->cawanganNama($kodcaw), + ], + ]); + } catch (\Throwable $e) { + Log::warning('Operasi batch notification failed: '.$e->getMessage(), [ + 'kodcaw' => $kodcaw, + 'batch_id' => $batchId, + ]); + } + } + + /** + * @param string $kodcaw + * @return string + */ + protected function cawanganNama($kodcaw) + { + $cawangan = Cawangan::on('mysql7')->where('kodcaw', '=', $kodcaw)->first(); + if (!$cawangan) { + return $kodcaw; + } + + $nama = trim((string) $cawangan->nama_cawangan); + + return $nama !== '' ? $nama : $kodcaw; + } + + /** + * Inbox for PC at this branch. Failures must not block the operasi action. + * + * @param string $kodcaw + * @param string $type + * @param array $data + * @return void + */ + protected function notifyPcPembiayaanOnline($kodcaw, $type, array $data) + { + try { + app(StaffNotificationClient::class)->notify([ + 'type' => $type, + 'cawangan' => $kodcaw, + 'audience' => ['role' => 'pc'], + 'data' => array_merge($data, [ + 'cawangan_nama' => $this->cawanganNama($kodcaw), + ]), + ]); + } catch (\Throwable $e) { + Log::warning('PC pembiayaan-online notification failed: '.$e->getMessage(), [ + 'kodcaw' => $kodcaw, + 'type' => $type, + ]); + } + } + + /** + * @param mixed $line + * @return array + */ + protected function lineNotifyFields($line) + { + if (!$line) { + return []; + } + + $isArr = is_array($line); + + return [ + 'norujukan' => $isArr ? ($line['norujukan'] ?? '') : $line->norujukan, + 'nama_pelanggan' => $isArr ? ($line['nama_pelanggan'] ?? '') : $line->nama_pelanggan, + 'pinjaman' => $isArr ? ($line['pinjaman'] ?? 0) : $line->pinjaman, + 'ops_by' => $isArr ? ($line['ops_by'] ?? '') : $line->ops_by, + 'reject_reason' => $isArr ? ($line['reject_reason'] ?? '') : $line->reject_reason, + ]; } /** @@ -826,7 +1153,7 @@ class PembiayaanOnlineService $now = Carbon::now(); try { - return DB::connection($mysql)->transaction(function () use ($mysql, $kodcaw, $id, $opsBy, $reason, $now) { + $result = DB::connection($mysql)->transaction(function () use ($mysql, $kodcaw, $id, $opsBy, $reason, $now) { $line = PembiayaanOnline::on($mysql) ->where('kodcaw', $kodcaw) ->where('id', $id) @@ -869,6 +1196,8 @@ class PembiayaanOnlineService 'rejected_at' => $now, 'ops_by' => $opsBy, 'batch_id' => null, + 'pc_verified_by' => null, + 'pc_verified_at' => null, ]); $batch = null; @@ -895,6 +1224,18 @@ class PembiayaanOnlineService 'payload' => ['message' => 'Gagal tolak pembiayaan online'], ]; } + + if (!empty($result['ok'])) { + $this->notifyPcPembiayaanOnline($kodcaw, 'pembiayaan_online.rejected_pc', array_merge( + $this->lineNotifyFields(isset($result['payload']['pembiayaan_online']) ? $result['payload']['pembiayaan_online'] : null), + [ + 'ops_by' => $opsBy, + 'reject_reason' => $reason, + ] + )); + } + + return $result; } /** @@ -1015,7 +1356,7 @@ class PembiayaanOnlineService } try { - return DB::connection($mysql)->transaction(function () use ( + $result = DB::connection($mysql)->transaction(function () use ( $mysql, $kodcaw, $id, @@ -1114,6 +1455,18 @@ class PembiayaanOnlineService 'payload' => ['message' => 'Gagal tanda PAID / muat naik bukti'], ]; } + + if (!empty($result['ok'])) { + $this->notifyPcPembiayaanOnline($kodcaw, 'pembiayaan_online.paid_pc', array_merge( + $this->lineNotifyFields(isset($result['payload']['pembiayaan_online']) ? $result['payload']['pembiayaan_online'] : null), + [ + 'paid_count' => 1, + 'ops_by' => $opsBy, + ] + )); + } + + return $result; } /** @@ -1159,7 +1512,7 @@ class PembiayaanOnlineService } try { - return DB::connection($mysql)->transaction(function () use ( + $result = DB::connection($mysql)->transaction(function () use ( $mysql, $kodcaw, $batchId, @@ -1251,6 +1604,19 @@ class PembiayaanOnlineService 'payload' => ['message' => 'Gagal tanda PAID batch'], ]; } + + if (!empty($result['ok'])) { + $batch = isset($result['payload']['batch']) ? $result['payload']['batch'] : null; + $this->notifyPcPembiayaanOnline($kodcaw, 'pembiayaan_online.paid_pc', [ + 'paid_count' => isset($result['payload']['dibayar']) ? (int) $result['payload']['dibayar'] : 0, + 'batch_id' => $batch ? (is_array($batch) ? ($batch['id'] ?? null) : $batch->id) : $batchId, + 'batch_no' => $batch ? (is_array($batch) ? ($batch['batch_no'] ?? '') : $batch->batch_no) : '', + 'jumlah_keseluruhan' => $batch ? (is_array($batch) ? ($batch['jumlah_keseluruhan'] ?? 0) : $batch->jumlah_keseluruhan) : 0, + 'ops_by' => $opsBy, + ]); + } + + return $result; } /** @@ -1314,6 +1680,65 @@ class PembiayaanOnlineService ]; } + /** + * Get attached bank-account slip (bukti_akaun_file_id) for a line. + * + * @return array{ok:bool,status:int,payload:mixed} + */ + public function getBuktiAkaun($kodcaw, $id) + { + $resolved = $this->resolveMysql($kodcaw); + if (!$resolved['ok']) { + return $resolved; + } + + $line = PembiayaanOnline::on($resolved['mysql']) + ->where('kodcaw', $kodcaw) + ->where('id', $id) + ->first(); + + if (!$line) { + return [ + 'ok' => false, + 'status' => 404, + 'payload' => ['message' => 'Pembiayaan online tidak dijumpai'], + ]; + } + + if (empty($line->bukti_akaun_file_id)) { + return [ + 'ok' => false, + 'status' => 404, + 'payload' => ['message' => 'Slip bank belum dimuat naik'], + ]; + } + + $file = ARFiles::on('mysql7')->where('id', $line->bukti_akaun_file_id)->first(); + if (!$file) { + return [ + 'ok' => false, + 'status' => 404, + 'payload' => ['message' => 'Fail slip bank tidak dijumpai'], + ]; + } + + return [ + 'ok' => true, + 'status' => 200, + 'payload' => [ + 'pembiayaan_online_id' => $line->id, + 'norujukan' => $line->norujukan, + 'file' => [ + 'id' => $file->id, + 'filename' => $file->filename, + 'type' => $file->type, + 'tarikhmasa' => $file->tarikhmasa, + 'data' => $file->data, + ], + ], + ]; + } + /** * PC list of PAID lines awaiting blast / tally. * @@ -1349,8 +1774,8 @@ class PembiayaanOnlineService } /** - * PC marks PAID line(s) as tallied / blast done (blast_sent=1). - * Actual WhatsApp/SMS dispatch can be wired later. + * PC marks PAID line(s) as tallied / blast done (blast_sent=1), + * then queues WhatsApp Cloud template to each customer (or ADMIN_PHONE_NUMBER off-prod). * * @param array|int|string $ids * @return array{ok:bool,status:int,payload:mixed} @@ -1379,7 +1804,7 @@ class PembiayaanOnlineService $updated = 0; try { - return DB::connection($mysql)->transaction(function () use ($mysql, $kodcaw, $ids, $blastBy, $now, &$updated) { + $result = DB::connection($mysql)->transaction(function () use ($mysql, $kodcaw, $ids, $blastBy, $now, &$updated) { $lines = PembiayaanOnline::on($mysql) ->where('kodcaw', $kodcaw) ->whereIn('id', $ids) @@ -1433,6 +1858,50 @@ class PembiayaanOnlineService 'payload' => ['message' => 'Gagal tanda blast/tally'], ]; } + + if (!empty($result['ok'])) { + $this->queuePaidWhatsapp($kodcaw, $result['payload']['data'] ?? []); + } + + return $result; + } + + /** + * Dispatch Cloud API jobs after tally commit. Failures are logged; tally stays PAID/blast_sent. + * + * @param \Illuminate\Support\Collection|array $lines + */ + protected function queuePaidWhatsapp($kodcaw, $lines) + { + $client = new WhatsappCloudClient(); + if (!$client->isConfigured()) { + Log::info('WhatsApp Cloud not configured; tally saved without send', ['kodcaw' => $kodcaw]); + return; + } + + $cawangan = Cawangan::on('mysql7')->where('kodcaw', $kodcaw)->first(); + $cawName = $cawangan ? $cawangan->nama_cawangan : $kodcaw; + + foreach ($lines as $line) { + try { + dispatch(new WhatsappPembiayaanOnlinePaid([ + 'kodcaw' => $kodcaw, + 'caw_name' => $cawName, + 'nokp' => $line->nokp ?? null, + 'norujukan' => $line->norujukan ?? null, + 'pinjaman' => $line->pinjaman ?? null, + 'nama_bank' => $line->nama_bank ?? null, + 'noakaun' => $line->noakaun ?? null, + 'tarikh_bayaran' => $line->tarikh_bayaran ?? null, + 'no_rujukan_bayaran' => $line->no_rujukan_bayaran ?? null, + ])); + } catch (\Throwable $e) { + Log::error('queuePaidWhatsapp dispatch failed: ' . $e->getMessage(), [ + 'kodcaw' => $kodcaw, + 'id' => $line->id ?? null, + ]); + } + } } /** @@ -1509,40 +1978,88 @@ class PembiayaanOnlineService return BatchPembiayaanOnline::on($mysql)->where('id', $batchId)->first(); } - public function suggestSlot() + public function slotJadual() { - $now = Carbon::now(); - $mins = ((int) $now->format('G')) * 60 + (int) $now->format('i'); - - if ($mins < 11 * 60) { - return [ + return [ + [ 'slot' => 'BATCH1', + 'label' => 'Batch 1', + 'mula' => '00:00', 'cutoff' => '11:00', 'proses' => '12:30', - 'lewat' => false, - 'nota' => 'Dalam waktu Batch 1', - ]; - } - - if ($mins < 15 * 60) { - return [ + ], + [ 'slot' => 'BATCH2', + 'label' => 'Batch 2', + 'mula' => '11:00', 'cutoff' => '15:00', 'proses' => '16:30', - 'lewat' => false, - 'nota' => 'Dalam waktu Batch 2', - ]; + ], + ]; + } + + public function suggestSlot() + { + $now = Carbon::now('Asia/Kuala_Lumpur'); + $mins = ((int) $now->format('G')) * 60 + (int) $now->format('i'); + $jadual = $this->slotJadual(); + $batch1 = $jadual[0]; + $batch2 = $jadual[1]; + $cutoff1 = $this->hmToMinutes($batch1['cutoff']); + $cutoff2 = $this->hmToMinutes($batch2['cutoff']); + + if ($mins < $cutoff1) { + return $this->slotPayload($batch1, false, $cutoff1 - $mins, 'Dalam waktu Batch 1', $now, $jadual); } + if ($mins < $cutoff2) { + return $this->slotPayload($batch2, false, $cutoff2 - $mins, 'Dalam waktu Batch 2', $now, $jadual); + } + + $lewat = $this->slotPayload( + $batch2, + true, + 0, + 'Selepas cutoff Batch 2 — masih boleh hantar; Operasi mungkin proses esok', + $now, + $jadual + ); + $lewat['proses'] = $batch2['proses'] . ' (hari berikutnya jika sudah lewat)'; + + return $lewat; + } + + protected function slotPayload(array $batch, $lewat, $bakiMinit, $nota, Carbon $now, array $jadual) + { + $parts = explode(':', (string) $batch['cutoff']); + $cutoffAt = $now->copy()->setTime( + isset($parts[0]) ? (int) $parts[0] : 0, + isset($parts[1]) ? (int) $parts[1] : 0, + 0 + ); + return [ - 'slot' => 'BATCH2', - 'cutoff' => '15:00', - 'proses' => '16:30 (hari berikutnya jika sudah lewat)', - 'lewat' => true, - 'nota' => 'Selepas cutoff Batch 2 — masih boleh hantar; Operasi mungkin proses esok', + 'slot' => $batch['slot'], + 'cutoff' => $batch['cutoff'], + 'cutoff_at' => $cutoffAt->toIso8601String(), + 'server_now' => $now->toIso8601String(), + 'proses' => $batch['proses'], + 'lewat' => (bool) $lewat, + 'baki_minit' => (int) $bakiMinit, + 'nota' => $nota, + 'jadual' => $jadual, ]; } + protected function hmToMinutes($hm) + { + $parts = explode(':', (string) $hm); + $h = isset($parts[0]) ? (int) $parts[0] : 0; + $m = isset($parts[1]) ? (int) $parts[1] : 0; + + return ($h * 60) + $m; + } + /** * One batch per branch / day / slot (B1-001 or B2-001). Later submits append. * diff --git a/app/Services/StaffNotificationClient.php b/app/Services/StaffNotificationClient.php new file mode 100644 index 0000000..6977808 --- /dev/null +++ b/app/Services/StaffNotificationClient.php @@ -0,0 +1,53 @@ +withHeaders([ + 'X-Internal-Token' => $secret, + 'Accept' => 'application/json', + ]) + ->asJson() + ->post($base . '/internal/notifications', $payload); + + if (!$response->successful()) { + Log::warning('Staff notification to kaunter failed', [ + 'status' => $response->status(), + 'body' => $response->body(), + 'type' => isset($payload['type']) ? $payload['type'] : null, + ]); + } + } catch (\Throwable $e) { + Log::warning('Staff notification to kaunter errored: '.$e->getMessage(), [ + 'type' => isset($payload['type']) ? $payload['type'] : null, + ]); + } + } +} diff --git a/app/Services/Whatsapp/WhatsappCloudClient.php b/app/Services/Whatsapp/WhatsappCloudClient.php new file mode 100644 index 0000000..6c5ac2d --- /dev/null +++ b/app/Services/Whatsapp/WhatsappCloudClient.php @@ -0,0 +1,100 @@ + $bodyParams + * @return \Illuminate\Http\Client\Response + */ + public function sendTemplate($to, $templateName, $lang, array $bodyParams = []) + { + $payload = [ + 'messaging_product' => 'whatsapp', + 'to' => $to, + 'type' => 'template', + 'template' => [ + 'name' => $templateName, + 'language' => ['code' => $lang], + ], + ]; + + if (count($bodyParams) > 0) { + $payload['template']['components'] = [[ + 'type' => 'body', + 'parameters' => array_map(function ($text) { + return [ + 'type' => 'text', + 'text' => $this->sanitizeParam($text), + ]; + }, array_values($bodyParams)), + ]]; + } + + $version = config('whatsapp.api_version', 'v25.0'); + $phoneId = config('whatsapp.phone_number_id'); + $url = 'https://graph.facebook.com/' . $version . '/' . $phoneId . '/messages'; + + $response = Http::withToken(config('whatsapp.token')) + ->acceptJson() + ->asJson() + ->post($url, $payload); + + if (!$response->successful()) { + Log::error('WhatsApp Cloud send failed', [ + 'to' => $to, + 'template' => $templateName, + 'status' => $response->status(), + 'body' => $response->json() ?: $response->body(), + ]); + } + + return $response; + } + + protected function sanitizeParam($text) + { + $text = trim(preg_replace('/\s+/', ' ', (string) $text)); + if ($text === '') { + return '-'; + } + + return mb_substr($text, 0, 200); + } +} diff --git a/app/Support/v2/Calculation.php b/app/Support/v2/Calculation.php index 178b275..c797c79 100644 --- a/app/Support/v2/Calculation.php +++ b/app/Support/v2/Calculation.php @@ -2,8 +2,11 @@ namespace App\Support\v2; +use App\Feature; +use App\KadarRebet; use App\KadarUpah; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Schema; class Calculation { @@ -55,7 +58,7 @@ class Calculation return $ujrah_sebenar; } - public function kiraanKeuntunganRebet(float $pembiayaan = 0.0,float $nilaimarhun = 0.0,float $kadarujrah = 0.0,float $margin = 0.0){ + public function kiraanKeuntunganRebet(float $pembiayaan = 0.0,float $nilaimarhun = 0.0,float $kadarujrah = 0.0,float $margin = 0.0, $kodcaw = null){ $this->one_percent = $this->getKadarUpah($nilaimarhun); @@ -66,8 +69,59 @@ class Calculation $ujrah_sebenar = (!empty($ujrah_sebenar)) ? $this->getRoundedMethod($ujrah_sebenar) : 0; $keuntungan = $onepercent + $ujrah_sebenar; + $annur = $this->kiraanDiskaunAnnur($kodcaw, $pembiayaan, $keuntungan); - return ['keuntungan' => $keuntungan,'onepercent' => $onepercent, 'ujrah' => $ujrah_sebenar]; + return [ + 'keuntungan' => $keuntungan, + 'onepercent' => $onepercent, + 'ujrah' => $ujrah_sebenar, + 'diskaun' => $annur['diskaun'], + 'kadarrebet' => $annur['kadarrebet'], + ]; + } + + /** + * Annur promotional discount. Other cawangan get 0 unless rebet_annur is enabled. + */ + public function kiraanDiskaunAnnur($kodcaw, float $pembiayaan = 0.0, float $keuntungan = 0.0) + { + $empty = ['kadarrebet' => 0, 'diskaun' => 0]; + + try { + if (!$kodcaw || !Feature::enabled($kodcaw, Feature::REBET_ANNUR)) { + return $empty; + } + } catch (\Exception $e) { + return $empty; + } + + $percent = $this->kiraanRebetAnnur($pembiayaan); + if ($percent <= 0 || $keuntungan <= 0) { + return ['kadarrebet' => $percent, 'diskaun' => 0]; + } + + return [ + 'kadarrebet' => $percent, + 'diskaun' => $this->getRoundedMethod($keuntungan * ($percent / 100)), + ]; + } + + private function kiraanRebetAnnur(float $pembiayaan = 0.0) + { + try { + if (!Schema::connection('mysql7')->hasTable('kadar_rebet')) { + return 0; + } + + $kadarrebet = KadarRebet::on('mysql7') + ->where('pembiayaan_min', '<=', $pembiayaan) + ->where('pembiayaan_max', '>=', $pembiayaan) + ->sum('kadarrebet'); + + return (float) $kadarrebet; + } catch (\Exception $e) { + return 0; + } } public function kiraanKeuntunganSebenar(float $pembiayaan = 0.0,float $nilaimarhun = 0.0,float $kadarujrah = 0.0,float $margin = 0.0){ diff --git a/app/Support/v2/GadaiV2.php b/app/Support/v2/GadaiV2.php index b3febe1..7c17ca5 100644 --- a/app/Support/v2/GadaiV2.php +++ b/app/Support/v2/GadaiV2.php @@ -5,6 +5,7 @@ namespace App\Support\v2; use App\Audit; use App\Cawangan; use App\Customer; +use App\Feature; use App\KadarUpah; use App\Support\v2\Calculation; use Carbon\Carbon; @@ -137,14 +138,13 @@ if (is_null($kadar_raw)) { $upah12 = $onepercentservices->getRoundedMethod($upah1 * 12); $ujrah = $onepercentservices->getRoundedMethod($keuntungan['ujrah']); $onepercent = $onepercentservices->getRoundedMethod($keuntungan['onepercent']); + $annur = $onepercentservices->kiraanDiskaunAnnur($request->kodcaw, $request->pinjaman, $keuntungan['keuntungan']); $hargajualan = $request->pinjaman + $upah12; $akrual = $this->kiraupahTawarruqStokAuditUjrahOnePercent(0.5,0,$kadar_raw,$request->pinjaman,$total_nilai_marhun,$margin_pinjam); - $gadai = Gadai::on($cawangan['mysql']) - ->where('norujukan','=',$norujukan) - ->update(array( + $gadaiFields = [ 'nilaimarhun' => $total_nilai_marhun, 'berat'=> $total_berat, 'pinjaman' => $request->pinjaman, @@ -176,7 +176,23 @@ if (is_null($kadar_raw)) { 'tagbaru' => 1, 'tunggakanujrah' => $akrual['ujrah'], 'tunggakanonepercent' => $akrual['keuntungan'], - )); + ]; + if (Feature::enabled($request->kodcaw, Feature::REBET_ANNUR)) { + $requestedKadar = (float) $request->input('kadar_rebate', 0); + $requestedDiskaun = (float) $request->input('rebate', 0); + + if ($requestedKadar > 0 || $requestedDiskaun > 0) { + $gadaiFields['kadarrebet'] = $requestedKadar; + $gadaiFields['diskaun'] = $requestedDiskaun; + } elseif (($request->transaction ?? '') === 'Daftar Gadai') { + $gadaiFields['kadarrebet'] = $annur['kadarrebet']; + $gadaiFields['diskaun'] = $annur['diskaun']; + } + } + + $gadai = Gadai::on($cawangan['mysql']) + ->where('norujukan','=',$norujukan) + ->update($gadaiFields); $new_data = Gadai::on($cawangan['mysql'])->where('norujukan','=',$norujukan)->first(); @@ -240,14 +256,15 @@ if (is_null($kadar_raw)) { } $bilang_bln = $tempoh - $gadai_data['tempohbayar']; - $upah = $onepercentservices->kiraanKeuntunganRebet($gadai_data['bakipjm'],$gadai_data['nilaimarhun'],$gadai_data['kadarupah'],$gadai_data['margin_semasa']); + $upah = $onepercentservices->kiraanKeuntunganRebet($gadai_data['bakipjm'],$gadai_data['nilaimarhun'],$gadai_data['kadarupah'],$gadai_data['margin_semasa'], $this->kodcaw); //$upahrebet_raw = $bilang_bln * $upah['keuntungan']; $onepercent = $onepercentservices->getRoundedMethod($bilang_bln * $upah['onepercent']); $ujrah = $onepercentservices->getRoundedMethod($bilang_bln * $upah['ujrah']); $upahrebet_raw = $onepercent + $ujrah; $upahrebet_raw = $onepercentservices->getRoundedMethod($upahrebet_raw); - + $upahrebet_raw = $upahrebet_raw - ($upah['diskaun'] ?? 0); + return $upahrebet_raw; } @@ -282,7 +299,7 @@ if (is_null($kadar_raw)) { $margin_semasa = ($gadai['bakipjm'] / $gadai['nilaimarhun']) * 100; - $keuntungan = $onepercent->kiraanKeuntunganRebet($gadai['bakipjm'],$gadai['nilaimarhun'],$gadai['kadarupah'],$gadai['margin_semasa']); + $keuntungan = $onepercent->kiraanKeuntunganRebet($gadai['bakipjm'],$gadai['nilaimarhun'],$gadai['kadarupah'],$gadai['margin_semasa'], $kodcaw); $ujrahasal = $onepercent->kiraanUjrahSebenar($gadai['nilaimarhun'],$gadai['kadarupah'],$gadai['percentpinj']); $onepercentasal = $gadai['pinjaman'] * (1/100); @@ -319,7 +336,7 @@ if (is_null($kadar_raw)) { $keun = $onepercent->getRoundedMethod($onepercentasal * $bilang_bln); $keuntungan_rebate = $onepercent->getRoundedMethod($keuntungan['onepercent'] * $bilang_bln); - $transaction_upah = TransaksiKeuntungan::on('mysql7')->create([ + $transactionUpahFields = [ 'norujukan' => $norujukan, 'bayaran_keuntungan' => $upahsemasa, 'bayaran_pembiayaan' => $baki_bayaran, @@ -333,7 +350,12 @@ if (is_null($kadar_raw)) { 'tempoh' => $gadai['tempoh'], 'beza_tempoh' => $bilang_bln, 'margin_semasa' => $margin_semasa, - ]); + ]; + if (Feature::enabled($kodcaw, Feature::REBET_ANNUR)) { + $transactionUpahFields['kadardiskaun'] = $keuntungan['diskaun'] ?? 0; + } + + $transaction_upah = TransaksiKeuntungan::on('mysql7')->create($transactionUpahFields); $transaksi_gadai = TransaksiGadai::on('mysql7')->create([ 'kodcaw' => $old_data['kodcaw'], diff --git a/app/Support/v2/Penebusan.php b/app/Support/v2/Penebusan.php index 6294831..0afe15d 100644 --- a/app/Support/v2/Penebusan.php +++ b/app/Support/v2/Penebusan.php @@ -5,6 +5,7 @@ namespace App\Support\v2; use App\Advansur; use App\Audit; use App\Cawangan; +use App\Feature; use App\KadarUpah; use App\Support\v2\Calculation; use Carbon\Carbon; @@ -39,6 +40,32 @@ class Penebusan $this->cawangan_info = $cawangan_info; } + private function diskaunAnnur($kodcaw, $gadai) + { + try { + if (!Feature::enabled($kodcaw, Feature::REBET_ANNUR)) { + return 0.0; + } + } catch (\Exception $e) { + return 0.0; + } + + return (float) ($gadai['diskaun'] ?? 0); + } + + private function tebusAnnurFields($kodcaw, $diskaun) + { + try { + if (!Feature::enabled($kodcaw, Feature::REBET_ANNUR)) { + return []; + } + } catch (\Exception $e) { + return []; + } + + return ['diskaun_rebate' => $diskaun]; + } + public function tebusTawarruq($kodcaw,$norujukan){ $onepercentservices = new Calculation(); @@ -53,7 +80,8 @@ class Penebusan $jeniskeuntungan = ($gadai_data['tagbaru'] == 1) ? 'onepercent' : 'asal'; $rebet = $this->rebetselepastawarruq($kodcaw,$norujukan,$jeniskeuntungan); - $harga_tebus = $gadai_data['bakihargajualan'] - $rebet; + $diskaun = $this->diskaunAnnur($kodcaw, $gadai_data); + $harga_tebus = $gadai_data['bakihargajualan'] - $rebet - $diskaun; // $hargatebus = round($harga_tebus,PHP_ROUND_HALF_UP); // $hargatebus = bcdiv(round($harga_tebus,2),1,1); @@ -485,6 +513,8 @@ class Penebusan $gadai = Gadai::on($cawangan['mysql'])->where('norujukan','=',$norujukan)->first(); + $diskaun = $this->diskaunAnnur($kodcaw, $gadai); + //check duplicate $data = Transaction::on('mysql7')->where('norujukan','=',$norujukan)->whereIn('trans_type', ['P', 'T', 'S'])->first(); @@ -502,7 +532,6 @@ class Penebusan $harga_tebus = $this->hargaTebusTawarruq($kodcaw,$norujukan,$request->jeniskeuntungan); $upah_tebus = $this->kiraupahTawarruq($norujukan); $upah_rebet = $this->kiraUpahRebetSebenar($kodcaw,$norujukan); - $upah_rebet_sebenar = $harga_tebus['harga'] - $gadai['bakipjm']; if($request->jeniskeuntungan == 'onepercent'){ $array_onepercent = $this->kiraupahUjrahOnePercent($kodcaw,$norujukan); @@ -514,10 +543,15 @@ class Penebusan $ujrah = $array_onepercent['ujrah']; $onepercent = $array_onepercent['onepercent']; } + + $harga_tebus['harga'] -= $diskaun; + $upah_rebet_sebenar = $harga_tebus['harga'] - $gadai['bakipjm']; } + $bayaran_keuntungan_bersih = max(0, $upah_rebet_sebenar); - $create_tebus = Tebus::on($cawangan['mysql'])->create([ + + $create_tebus = Tebus::on($cawangan['mysql'])->create(array_merge([ 'kodcaw'=> $kodcaw, 'norujukan'=> $norujukan, 'nopelanggan' => $request->nopelanggan, @@ -543,7 +577,7 @@ class Penebusan 'teller' => $request->teller, 'ujrah' => $ujrah_rebet, 'onepercent' => $onepercent_rebet, - ]); + ], $this->tebusAnnurFields($kodcaw, $diskaun))); $create_inoutmar = InOutMar::on($cawangan['mysql'])->create([ 'tarikh' => $current->toDateString(), @@ -561,7 +595,7 @@ class Penebusan $transaction_upah = TransaksiKeuntungan::on('mysql7')->create([ 'norujukan' => $norujukan, - 'bayaran_keuntungan' => $upah_tebus, + 'bayaran_keuntungan' => $bayaran_keuntungan_bersih, 'bayaran_pembiayaan' => $gadai['bakipjm'], 'keuntungan_rebet' => $upah_rebet_sebenar, 'tarikh_bayaran'=> $current, @@ -651,6 +685,8 @@ class Penebusan $gadai = Gadai::on($cawangan['mysql'])->where('norujukan','=',$norujukan)->first(); + $diskaun = $this->diskaunAnnur($kodcaw, $gadai); + //check duplicate $data = Transaction::on('mysql7')->where('norujukan','=',$norujukan)->where('trans_type','=','AT')->first(); @@ -668,7 +704,6 @@ class Penebusan $harga_tebus = $this->hargaTebusTawarruq($kodcaw,$norujukan,$request->jeniskeuntungan); $upah_tebus = $this->kiraupahTawarruq($norujukan); $upah_rebet = $this->kiraUpahRebetSebenar($kodcaw,$norujukan); - $upah_rebet_sebenar = $harga_tebus['harga'] - $gadai['bakipjm']; if($request->jeniskeuntungan == 'onepercent'){ $array_onepercent = $this->kiraupahUjrahOnePercent($kodcaw,$norujukan); @@ -681,6 +716,9 @@ class Penebusan $ujrah = $array_onepercent['ujrah']; $onepercent = $array_onepercent['onepercent']; } + + $harga_tebus['harga'] -= $diskaun; + $upah_rebet_sebenar = $harga_tebus['harga'] - $gadai['bakipjm']; } $update_gadai = Gadai::on($cawangan['mysql'])->where('norujukan','=',$norujukan)->update(array( @@ -690,7 +728,7 @@ class Penebusan // $upah_rebet = $this->kiraUpahRebet($kodcaw,$norujukan); - $create_tebus = Tebus::on($cawangan['mysql'])->create([ + $create_tebus = Tebus::on($cawangan['mysql'])->create(array_merge([ 'kodcaw'=> $kodcaw, 'norujukan'=> $norujukan, 'nopelanggan' => $request->nopelanggan, @@ -716,7 +754,7 @@ class Penebusan 'teller' => $request->teller, 'ujrah' => $ujrah_rebet, 'onepercent' => $onepercent_rebet, - ]); + ], $this->tebusAnnurFields($kodcaw, $diskaun))); $create_inoutmar = InOutMar::on($cawangan['mysql'])->create([ 'tarikh' => $current->toDateString(), @@ -734,9 +772,11 @@ class Penebusan $bayaran_pembiayaan = $request->totalbayaran - $request->bakiupah; + $bayaran_keuntungan_bersih = max(0, $upah_rebet_sebenar); + $transaction_upah = TransaksiKeuntungan::on('mysql7')->create([ 'norujukan' => $norujukan, - 'bayaran_keuntungan' => $upah_tebus, + 'bayaran_keuntungan' => $bayaran_keuntungan_bersih, 'bayaran_pembiayaan' => $bayaran_pembiayaan, 'keuntungan_rebet' => $upah_rebet_sebenar, 'tarikh_bayaran'=> $current, @@ -1131,12 +1171,16 @@ class Penebusan $onepercent_rebet = $array_onepercent_rebet['onepercent'] - $upah_rebet['onepercent']; $ujrah_rebet = $array_onepercent_rebet['ujrah'] - $upah_rebet['ujrah']; + $diskaun = $this->diskaunAnnur($kodcaw, $gadai); + $harga_tebus['harga'] -= $diskaun; $upah_rebet_sebenar = $harga_tebus['harga'] - $gadai['bakipjm']; + $bayaran_keuntungan_bersih = max(0, $upah_rebet_sebenar); + try{ TransaksiKeuntungan::on('mysql7')->create([ 'norujukan' => $norujukan, - 'bayaran_keuntungan' => $upah_tebus, + 'bayaran_keuntungan' => $bayaran_keuntungan_bersih, 'bayaran_pembiayaan' => $bayaran_pembiayaan, 'keuntungan_rebet' => $upah_rebet_sebenar, 'tarikh_bayaran'=> $current, diff --git a/app/Tebus.php b/app/Tebus.php index 4d01786..e161227 100644 --- a/app/Tebus.php +++ b/app/Tebus.php @@ -52,7 +52,8 @@ class Tebus extends Model 'pinjamanterkini', 'tarikhbyrn', 'ujrah', - 'onepercent' + 'onepercent', + 'diskaun_rebate' ]; /** diff --git a/app/TransaksiKeuntungan.php b/app/TransaksiKeuntungan.php index 2fa926e..d0e8a71 100644 --- a/app/TransaksiKeuntungan.php +++ b/app/TransaksiKeuntungan.php @@ -14,7 +14,7 @@ class TransaksiKeuntungan extends Model * @var array */ protected $fillable = [ - 'norujukan','bayaran_keuntungan','tarikh_bayaran','kodcaw','bayaran_pembiayaan','keuntungan_rebet','ujrah','ujrah_rebet','onepercent','onepercent_rebet','tempoh','beza_tempoh','margin_semasa','rounded' + 'norujukan','bayaran_keuntungan','tarikh_bayaran','kodcaw','bayaran_pembiayaan','keuntungan_rebet','ujrah','ujrah_rebet','onepercent','onepercent_rebet','tempoh','beza_tempoh','margin_semasa','rounded','kadardiskaun' ]; /** diff --git a/bootstrap/app.php b/bootstrap/app.php index 9e4fe1c..428e465 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -89,11 +89,14 @@ $app->singleton( $app->configure('app'); $app->configure('services'); $app->configure('logging'); +$app->configure('logviewer'); $app->configure('tinker'); $app->configure('tennant_database'); $app->configure('report'); $app->configure('app_parameter'); $app->configure('parameter'); +$app->configure('whatsapp'); +$app->configure('kaunter'); /* |-------------------------------------------------------------------------- | Register Middleware @@ -109,9 +112,9 @@ $app->configure('parameter'); // App\Http\Middleware\ExampleMiddleware::class // ]); -// $app->routeMiddleware([ -// 'auth' => App\Http\Middleware\Authenticate::class, -// ]); +$app->routeMiddleware([ + 'logviewer.password' => App\Http\Middleware\LogViewerPassword::class, +]); /* |-------------------------------------------------------------------------- diff --git a/composer_backuo.json b/composer_backuo.json deleted file mode 100644 index ae83d4e..0000000 --- a/composer_backuo.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "laravel/lumen", - "description": "The Laravel Lumen Framework.", - "keywords": ["framework", "laravel", "lumen"], - "license": "MIT", - "type": "project", - "require": { - "php": "^7.2.5", - "auth0/auth0-php": "^7.4", - "laravel/lumen-framework": "^7.0", - "rap2hpoutre/laravel-log-viewer": "^1.7" - }, - "require-dev": { - "fzaninotto/faker": "^1.9.1", - "mockery/mockery": "^1.3.1", - "phpunit/phpunit": "^8.5" - }, - "autoload": { - "classmap": [ - "database/seeds", - "database/factories" - ], - "psr-4": { - "App\\": "app/" - } - }, - "autoload-dev": { - "classmap": [ - "tests/" - ] - }, - "config": { - "preferred-install": "dist", - "sort-packages": true, - "optimize-autoloader": true - }, - "minimum-stability": "dev", - "prefer-stable": true, - "scripts": { - "post-root-package-install": [ - "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" - ] - } -} diff --git a/composer_backup.lock b/composer_backup.lock deleted file mode 100644 index 8c80b95..0000000 --- a/composer_backup.lock +++ /dev/null @@ -1,7182 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "f3fc95d4bf94ca7763a98f60d5a6fd91", - "packages": [ - { - "name": "auth0/auth0-php", - "version": "7.9.2", - "source": { - "type": "git", - "url": "https://github.com/auth0/auth0-PHP.git", - "reference": "95cdd4f09122f14d0b0246fe8c51287ece63f98a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/auth0/auth0-PHP/zipball/95cdd4f09122f14d0b0246fe8c51287ece63f98a", - "reference": "95cdd4f09122f14d0b0246fe8c51287ece63f98a", - "shasum": "" - }, - "require": { - "auth0/php-jwt": "3.3.4", - "ext-json": "*", - "ext-openssl": "*", - "guzzlehttp/guzzle": "^6.0|^7.0", - "guzzlehttp/psr7": "^1.8", - "php": "^7.3 | ^8.0", - "psr/simple-cache": "^1.0" - }, - "require-dev": { - "cache/adapter-common": "^1.2", - "cache/array-adapter": "^1.1", - "cache/hierarchical-cache": "^1.1", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7", - "josegonzalez/dotenv": "^3.2", - "phpcompatibility/php-compatibility": "^8.1", - "phpstan/phpstan": "^0.12.64", - "phpunit/phpunit": "^9.3", - "squizlabs/php_codesniffer": "^3.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "Auth0\\SDK\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Auth0", - "email": "support@auth0.com", - "homepage": "http://www.auth0.com/" - } - ], - "description": "Auth0 PHP SDK.", - "homepage": "https://github.com/auth0/auth0-PHP", - "support": { - "issues": "https://github.com/auth0/auth0-PHP/issues", - "source": "https://github.com/auth0/auth0-PHP/tree/7.9.2" - }, - "time": "2021-08-04T13:08:48+00:00" - }, - { - "name": "auth0/php-jwt", - "version": "3.3.4", - "source": { - "type": "git", - "url": "https://github.com/auth0/php-jwt.git", - "reference": "a0daa1a728cf85230843ebb8c1183047fe493284" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/auth0/php-jwt/zipball/a0daa1a728cf85230843ebb8c1183047fe493284", - "reference": "a0daa1a728cf85230843ebb8c1183047fe493284", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "ext-openssl": "*", - "php": "^5.6 || ^7.0 || ^8.0" - }, - "require-dev": { - "mikey179/vfsstream": "~1.5", - "phpmd/phpmd": "~2.2", - "phpunit/php-invoker": "~1.1", - "phpunit/phpunit": "^5.7 || ^7.3", - "squizlabs/php_codesniffer": "~2.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, - "autoload": { - "psr-4": { - "Lcobucci\\JWT\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Luís Otávio Cobucci Oblonczyk", - "email": "lcobucci@gmail.com", - "role": "Developer" - } - ], - "description": "A simple library to work with JSON Web Token and JSON Web Signature", - "keywords": [ - "JWS", - "jwt" - ], - "support": { - "source": "https://github.com/auth0/php-jwt/tree/3.3.4" - }, - "funding": [ - { - "url": "https://github.com/lcobucci", - "type": "github" - }, - { - "url": "https://www.patreon.com/lcobucci", - "type": "patreon" - } - ], - "time": "2021-01-04T20:39:06+00:00" - }, - { - "name": "brick/math", - "version": "0.9.3", - "source": { - "type": "git", - "url": "https://github.com/brick/math.git", - "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/ca57d18f028f84f777b2168cd1911b0dee2343ae", - "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.2", - "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.0", - "vimeo/psalm": "4.9.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "Brick\\Math\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Arbitrary-precision arithmetic library", - "keywords": [ - "Arbitrary-precision", - "BigInteger", - "BigRational", - "arithmetic", - "bigdecimal", - "bignum", - "brick", - "math" - ], - "support": { - "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.9.3" - }, - "funding": [ - { - "url": "https://github.com/BenMorel", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/brick/math", - "type": "tidelift" - } - ], - "time": "2021-08-15T20:50:18+00:00" - }, - { - "name": "doctrine/inflector", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/doctrine/inflector.git", - "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", - "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^8.2", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpstan/phpstan-strict-rules": "^0.12", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", - "vimeo/psalm": "^4.10" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", - "homepage": "https://www.doctrine-project.org/projects/inflector.html", - "keywords": [ - "inflection", - "inflector", - "lowercase", - "manipulation", - "php", - "plural", - "singular", - "strings", - "uppercase", - "words" - ], - "support": { - "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.4" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", - "type": "tidelift" - } - ], - "time": "2021-10-22T20:16:43+00:00" - }, - { - "name": "doctrine/lexer", - "version": "1.2.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9.0", - "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.11" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "https://www.doctrine-project.org/projects/lexer.html", - "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" - ], - "support": { - "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/1.2.3" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", - "type": "tidelift" - } - ], - "time": "2022-02-28T11:07:21+00:00" - }, - { - "name": "dragonmantank/cron-expression", - "version": "v2.3.1", - "source": { - "type": "git", - "url": "https://github.com/dragonmantank/cron-expression.git", - "reference": "65b2d8ee1f10915efb3b55597da3404f096acba2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/65b2d8ee1f10915efb3b55597da3404f096acba2", - "reference": "65b2d8ee1f10915efb3b55597da3404f096acba2", - "shasum": "" - }, - "require": { - "php": "^7.0|^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.4|^7.0|^8.0|^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - } - }, - "autoload": { - "psr-4": { - "Cron\\": "src/Cron/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Chris Tankersley", - "email": "chris@ctankersley.com", - "homepage": "https://github.com/dragonmantank" - } - ], - "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", - "keywords": [ - "cron", - "schedule" - ], - "support": { - "issues": "https://github.com/dragonmantank/cron-expression/issues", - "source": "https://github.com/dragonmantank/cron-expression/tree/v2.3.1" - }, - "funding": [ - { - "url": "https://github.com/dragonmantank", - "type": "github" - } - ], - "time": "2020-10-13T00:52:37+00:00" - }, - { - "name": "egulias/email-validator", - "version": "2.1.25", - "source": { - "type": "git", - "url": "https://github.com/egulias/EmailValidator.git", - "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0dbf5d78455d4d6a41d186da50adc1122ec066f4", - "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4", - "shasum": "" - }, - "require": { - "doctrine/lexer": "^1.0.1", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.10" - }, - "require-dev": { - "dominicsayers/isemail": "^3.0.7", - "phpunit/phpunit": "^4.8.36|^7.5.15", - "satooshi/php-coveralls": "^1.0.1" - }, - "suggest": { - "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Egulias\\EmailValidator\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eduardo Gulias Davis" - } - ], - "description": "A library for validating emails against several RFCs", - "homepage": "https://github.com/egulias/EmailValidator", - "keywords": [ - "email", - "emailvalidation", - "emailvalidator", - "validation", - "validator" - ], - "support": { - "issues": "https://github.com/egulias/EmailValidator/issues", - "source": "https://github.com/egulias/EmailValidator/tree/2.1.25" - }, - "funding": [ - { - "url": "https://github.com/egulias", - "type": "github" - } - ], - "time": "2020-12-29T14:50:06+00:00" - }, - { - "name": "guzzlehttp/guzzle", - "version": "7.4.3", - "source": { - "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "74a8602c6faec9ef74b7a9391ac82c5e65b1cdab" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/74a8602c6faec9ef74b7a9391ac82c5e65b1cdab", - "reference": "74a8602c6faec9ef74b7a9391ac82c5e65b1cdab", - "shasum": "" - }, - "require": { - "ext-json": "*", - "guzzlehttp/promises": "^1.5", - "guzzlehttp/psr7": "^1.8.3 || ^2.1", - "php": "^7.2.5 || ^8.0", - "psr/http-client": "^1.0", - "symfony/deprecation-contracts": "^2.2 || ^3.0" - }, - "provide": { - "psr/http-client-implementation": "1.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", - "ext-curl": "*", - "php-http/client-integration-tests": "^3.0", - "phpunit/phpunit": "^8.5.5 || ^9.3.5", - "psr/log": "^1.1 || ^2.0 || ^3.0" - }, - "suggest": { - "ext-curl": "Required for CURL handler support", - "ext-intl": "Required for Internationalized Domain Name (IDN) support", - "psr/log": "Required for using the Log middleware" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.4-dev" - } - }, - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "GuzzleHttp\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Jeremy Lindblom", - "email": "jeremeamia@gmail.com", - "homepage": "https://github.com/jeremeamia" - }, - { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - } - ], - "description": "Guzzle is a PHP HTTP client library", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "psr-18", - "psr-7", - "rest", - "web service" - ], - "support": { - "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.4.3" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", - "type": "tidelift" - } - ], - "time": "2022-05-25T13:24:33+00:00" - }, - { - "name": "guzzlehttp/promises", - "version": "1.5.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da", - "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da", - "shasum": "" - }, - "require": { - "php": ">=5.5" - }, - "require-dev": { - "symfony/phpunit-bridge": "^4.4 || ^5.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.5-dev" - } - }, - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "GuzzleHttp\\Promise\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - } - ], - "description": "Guzzle promises library", - "keywords": [ - "promise" - ], - "support": { - "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.5.1" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", - "type": "tidelift" - } - ], - "time": "2021-10-22T20:56:57+00:00" - }, - { - "name": "guzzlehttp/psr7", - "version": "1.8.5", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "337e3ad8e5716c15f9657bd214d16cc5e69df268" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/337e3ad8e5716c15f9657bd214d16cc5e69df268", - "reference": "337e3ad8e5716c15f9657bd214d16cc5e69df268", - "shasum": "" - }, - "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0", - "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "ext-zlib": "*", - "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" - }, - "suggest": { - "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.7-dev" - } - }, - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - } - ], - "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" - ], - "support": { - "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/1.8.5" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", - "type": "tidelift" - } - ], - "time": "2022-03-20T21:51:18+00:00" - }, - { - "name": "illuminate/auth", - "version": "v7.30.6", - "source": { - "type": "git", - "url": "https://github.com/illuminate/auth.git", - "reference": "d523b7b96cd1afc55d24afba8fc3176e84eb8154" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/auth/zipball/d523b7b96cd1afc55d24afba8fc3176e84eb8154", - "reference": "d523b7b96cd1afc55d24afba8fc3176e84eb8154", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^7.0", - "illuminate/http": "^7.0", - "illuminate/queue": "^7.0", - "illuminate/support": "^7.0", - "php": "^7.2.5|^8.0" - }, - "suggest": { - "illuminate/console": "Required to use the auth:clear-resets command (^7.0).", - "illuminate/queue": "Required to fire login / logout events (^7.0).", - "illuminate/session": "Required to use the session based guard (^7.0)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Auth\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Auth package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2020-10-27T15:11:37+00:00" - }, - { - "name": "illuminate/broadcasting", - "version": "v7.30.6", - "source": { - "type": "git", - "url": "https://github.com/illuminate/broadcasting.git", - "reference": "b30bf4ff2b020a98aca537877a68fabecfa3a8ab" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/broadcasting/zipball/b30bf4ff2b020a98aca537877a68fabecfa3a8ab", - "reference": "b30bf4ff2b020a98aca537877a68fabecfa3a8ab", - "shasum": "" - }, - "require": { - "ext-json": "*", - "illuminate/bus": "^7.0", - "illuminate/contracts": "^7.0", - "illuminate/queue": "^7.0", - "illuminate/support": "^7.0", - "php": "^7.2.5|^8.0", - "psr/log": "^1.0" - }, - "suggest": { - "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^4.0)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Broadcasting\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Broadcasting package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2020-11-21T14:36:22+00:00" - }, - { - "name": "illuminate/bus", - "version": "v7.30.6", - "source": { - "type": "git", - "url": "https://github.com/illuminate/bus.git", - "reference": "78d8013a700eef9fbece09094d422d73fa9a493a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/bus/zipball/78d8013a700eef9fbece09094d422d73fa9a493a", - "reference": "78d8013a700eef9fbece09094d422d73fa9a493a", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^7.0", - "illuminate/pipeline": "^7.0", - "illuminate/support": "^7.0", - "php": "^7.2.5|^8.0" - }, - "suggest": { - "illuminate/queue": "Required to use closures when chaining jobs (^7.0)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Bus\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Bus package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2020-10-27T15:11:37+00:00" - }, - { - "name": "illuminate/cache", - "version": "v7.30.6", - "source": { - "type": "git", - "url": "https://github.com/illuminate/cache.git", - "reference": "f9155c4827600ea3e0743eb03402f8048c04455c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/cache/zipball/f9155c4827600ea3e0743eb03402f8048c04455c", - "reference": "f9155c4827600ea3e0743eb03402f8048c04455c", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^7.0", - "illuminate/support": "^7.0", - "php": "^7.2.5|^8.0" - }, - "suggest": { - "ext-memcached": "Required to use the memcache cache driver.", - "illuminate/database": "Required to use the database cache driver (^7.0).", - "illuminate/filesystem": "Required to use the file cache driver (^7.0).", - "illuminate/redis": "Required to use the redis cache driver (^7.0).", - "symfony/cache": "Required to PSR-6 cache bridge (^5.0)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Cache\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Cache package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2020-10-27T15:11:37+00:00" - }, - { - "name": "illuminate/config", - "version": "v7.30.6", - "source": { - "type": "git", - "url": "https://github.com/illuminate/config.git", - "reference": "9d908793eceb04a8c8f74cfc6af3429ce140d2e2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/config/zipball/9d908793eceb04a8c8f74cfc6af3429ce140d2e2", - "reference": "9d908793eceb04a8c8f74cfc6af3429ce140d2e2", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^7.0", - "illuminate/support": "^7.0", - "php": "^7.2.5|^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Config\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Config package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2020-10-27T15:11:37+00:00" - }, - { - "name": "illuminate/console", - "version": "v7.30.6", - "source": { - "type": "git", - "url": "https://github.com/illuminate/console.git", - "reference": "c2c078d71efc8d75ca3741402a4b0fd3bf05c6fc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/console/zipball/c2c078d71efc8d75ca3741402a4b0fd3bf05c6fc", - "reference": "c2c078d71efc8d75ca3741402a4b0fd3bf05c6fc", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^7.0", - "illuminate/support": "^7.0", - "php": "^7.2.5|^8.0", - "symfony/console": "^5.0", - "symfony/process": "^5.0" - }, - "suggest": { - "dragonmantank/cron-expression": "Required to use scheduler (^2.3.1).", - "guzzlehttp/guzzle": "Required to use the ping methods on schedules (^6.3.1|^7.0.1).", - "illuminate/bus": "Required to use the scheduled job dispatcher (^7.0).", - "illuminate/container": "Required to use the scheduler (^7.0).", - "illuminate/filesystem": "Required to use the generator command (^7.0).", - "illuminate/queue": "Required to use closures for scheduled jobs (^7.0)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Console\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Console package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2021-11-17T15:00:14+00:00" - }, - { - "name": "illuminate/container", - "version": "v7.30.6", - "source": { - "type": "git", - "url": "https://github.com/illuminate/container.git", - "reference": "06456a2ea5656c2f1ebda37039ce14c1bfc973b3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/container/zipball/06456a2ea5656c2f1ebda37039ce14c1bfc973b3", - "reference": "06456a2ea5656c2f1ebda37039ce14c1bfc973b3", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^7.0", - "php": "^7.2.5|^8.0", - "psr/container": "^1.0" - }, - "provide": { - "psr/container-implementation": "1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Container\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Container package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2021-11-17T15:00:14+00:00" - }, - { - "name": "illuminate/contracts", - "version": "v7.30.6", - "source": { - "type": "git", - "url": "https://github.com/illuminate/contracts.git", - "reference": "2449f2ea949ddf995a3dcffe5e21c768cf7d6478" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/contracts/zipball/2449f2ea949ddf995a3dcffe5e21c768cf7d6478", - "reference": "2449f2ea949ddf995a3dcffe5e21c768cf7d6478", - "shasum": "" - }, - "require": { - "php": "^7.2.5|^8.0", - "psr/container": "^1.0", - "psr/simple-cache": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Contracts\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Contracts package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2021-11-17T15:00:14+00:00" - }, - { - "name": "illuminate/database", - "version": "v7.30.6", - "source": { - "type": "git", - "url": "https://github.com/illuminate/database.git", - "reference": "e26b023f23c08968950470189e108e30f2e3b7ba" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/database/zipball/e26b023f23c08968950470189e108e30f2e3b7ba", - "reference": "e26b023f23c08968950470189e108e30f2e3b7ba", - "shasum": "" - }, - "require": { - "ext-json": "*", - "illuminate/container": "^7.0", - "illuminate/contracts": "^7.0", - "illuminate/support": "^7.0", - "php": "^7.2.5|^8.0", - "symfony/console": "^5.0" - }, - "suggest": { - "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6).", - "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", - "illuminate/console": "Required to use the database commands (^7.0).", - "illuminate/events": "Required to use the observers with Eloquent (^7.0).", - "illuminate/filesystem": "Required to use the migrations (^7.0).", - "illuminate/pagination": "Required to paginate the result set (^7.0).", - "symfony/finder": "Required to use Eloquent model factories (^5.0)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Database\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Database package.", - "homepage": "https://laravel.com", - "keywords": [ - "database", - "laravel", - "orm", - "sql" - ], - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2021-11-17T15:00:14+00:00" - }, - { - "name": "illuminate/encryption", - "version": "v7.30.6", - "source": { - "type": "git", - "url": "https://github.com/illuminate/encryption.git", - "reference": "2b58e3a5175003f8a2272691a8b5c6c8e059c97d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/encryption/zipball/2b58e3a5175003f8a2272691a8b5c6c8e059c97d", - "reference": "2b58e3a5175003f8a2272691a8b5c6c8e059c97d", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-mbstring": "*", - "ext-openssl": "*", - "illuminate/contracts": "^7.0", - "illuminate/support": "^7.0", - "php": "^7.2.5|^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Encryption\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Encryption package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2020-10-27T15:11:37+00:00" - }, - { - "name": "illuminate/events", - "version": "v7.30.6", - "source": { - "type": "git", - "url": "https://github.com/illuminate/events.git", - "reference": "6f64db49dbfd490c6e30c983964543a054882faf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/events/zipball/6f64db49dbfd490c6e30c983964543a054882faf", - "reference": "6f64db49dbfd490c6e30c983964543a054882faf", - "shasum": "" - }, - "require": { - "illuminate/container": "^7.0", - "illuminate/contracts": "^7.0", - "illuminate/support": "^7.0", - "php": "^7.2.5|^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Events\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Events package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2020-10-27T15:11:37+00:00" - }, - { - "name": "illuminate/filesystem", - "version": "v7.30.6", - "source": { - "type": "git", - "url": "https://github.com/illuminate/filesystem.git", - "reference": "2013f94a3a7dff008be54884774548e3c222c3e8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/filesystem/zipball/2013f94a3a7dff008be54884774548e3c222c3e8", - "reference": "2013f94a3a7dff008be54884774548e3c222c3e8", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^7.0", - "illuminate/support": "^7.0", - "php": "^7.2.5|^8.0", - "symfony/finder": "^5.0" - }, - "suggest": { - "ext-ftp": "Required to use the Flysystem FTP driver.", - "illuminate/http": "Required for handling uploaded files (^7.0).", - "league/flysystem": "Required to use the Flysystem local and FTP drivers (^1.1).", - "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).", - "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).", - "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).", - "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", - "symfony/mime": "Required to enable support for guessing extensions (^5.0)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Filesystem\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Filesystem package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2020-10-27T15:11:37+00:00" - }, - { - "name": "illuminate/hashing", - "version": "v7.30.6", - "source": { - "type": "git", - "url": "https://github.com/illuminate/hashing.git", - "reference": "021a2a74f77f2b7bab4ef19b32bb9326c7cefacd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/hashing/zipball/021a2a74f77f2b7bab4ef19b32bb9326c7cefacd", - "reference": "021a2a74f77f2b7bab4ef19b32bb9326c7cefacd", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^7.0", - "illuminate/support": "^7.0", - "php": "^7.2.5|^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Hashing\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Hashing package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2020-10-27T15:11:37+00:00" - }, - { - "name": "illuminate/http", - "version": "v7.30.6", - "source": { - "type": "git", - "url": "https://github.com/illuminate/http.git", - "reference": "39d6e9eca58b575016be5d85cc1f223f632c0e95" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/http/zipball/39d6e9eca58b575016be5d85cc1f223f632c0e95", - "reference": "39d6e9eca58b575016be5d85cc1f223f632c0e95", - "shasum": "" - }, - "require": { - "ext-json": "*", - "illuminate/session": "^7.0", - "illuminate/support": "^7.0", - "php": "^7.2.5|^8.0", - "symfony/http-foundation": "^5.0", - "symfony/http-kernel": "^5.0", - "symfony/mime": "^5.0" - }, - "suggest": { - "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", - "guzzlehttp/guzzle": "Required to use the HTTP Client (^6.3.1|^7.0.1)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Http\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Http package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2021-01-21T14:08:35+00:00" - }, - { - "name": "illuminate/log", - "version": "v7.30.6", - "source": { - "type": "git", - "url": "https://github.com/illuminate/log.git", - "reference": "6152160fac69ff3267ccc1e87ea070503b79a906" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/log/zipball/6152160fac69ff3267ccc1e87ea070503b79a906", - "reference": "6152160fac69ff3267ccc1e87ea070503b79a906", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^7.0", - "illuminate/support": "^7.0", - "monolog/monolog": "^2.0", - "php": "^7.2.5|^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Log\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Log package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2021-11-17T15:00:14+00:00" - }, - { - "name": "illuminate/pagination", - "version": "v7.30.6", - "source": { - "type": "git", - "url": "https://github.com/illuminate/pagination.git", - "reference": "5815c28d9430fb3eff673c6876881621b4fea48b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/pagination/zipball/5815c28d9430fb3eff673c6876881621b4fea48b", - "reference": "5815c28d9430fb3eff673c6876881621b4fea48b", - "shasum": "" - }, - "require": { - "ext-json": "*", - "illuminate/contracts": "^7.0", - "illuminate/support": "^7.0", - "php": "^7.2.5|^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Pagination\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Pagination package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2021-11-17T15:00:14+00:00" - }, - { - "name": "illuminate/pipeline", - "version": "v7.30.6", - "source": { - "type": "git", - "url": "https://github.com/illuminate/pipeline.git", - "reference": "68434133b675a9914868fb2d8f665ec2157d9faa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/pipeline/zipball/68434133b675a9914868fb2d8f665ec2157d9faa", - "reference": "68434133b675a9914868fb2d8f665ec2157d9faa", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^7.0", - "illuminate/support": "^7.0", - "php": "^7.2.5|^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Pipeline\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Pipeline package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2020-10-27T15:11:37+00:00" - }, - { - "name": "illuminate/queue", - "version": "v7.30.6", - "source": { - "type": "git", - "url": "https://github.com/illuminate/queue.git", - "reference": "91d7b3db1c816f08bb7607a3ec662a6b7015e112" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/queue/zipball/91d7b3db1c816f08bb7607a3ec662a6b7015e112", - "reference": "91d7b3db1c816f08bb7607a3ec662a6b7015e112", - "shasum": "" - }, - "require": { - "ext-json": "*", - "illuminate/console": "^7.0", - "illuminate/container": "^7.0", - "illuminate/contracts": "^7.0", - "illuminate/database": "^7.0", - "illuminate/filesystem": "^7.0", - "illuminate/pipeline": "^7.0", - "illuminate/support": "^7.0", - "opis/closure": "^3.6", - "php": "^7.2.5|^8.0", - "ramsey/uuid": "^3.7|^4.0", - "symfony/process": "^5.0" - }, - "suggest": { - "aws/aws-sdk-php": "Required to use the SQS queue driver and DynamoDb failed job storage (^3.155).", - "ext-pcntl": "Required to use all features of the queue worker.", - "ext-posix": "Required to use all features of the queue worker.", - "illuminate/redis": "Required to use the Redis queue driver (^7.0).", - "pda/pheanstalk": "Required to use the Beanstalk queue driver (^4.0)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Queue\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Queue package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2021-11-17T15:00:14+00:00" - }, - { - "name": "illuminate/session", - "version": "v7.30.6", - "source": { - "type": "git", - "url": "https://github.com/illuminate/session.git", - "reference": "b18bc348f4af2afae78e72ea332a4390c5c01a72" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/session/zipball/b18bc348f4af2afae78e72ea332a4390c5c01a72", - "reference": "b18bc348f4af2afae78e72ea332a4390c5c01a72", - "shasum": "" - }, - "require": { - "ext-json": "*", - "illuminate/contracts": "^7.0", - "illuminate/filesystem": "^7.0", - "illuminate/support": "^7.0", - "php": "^7.2.5|^8.0", - "symfony/finder": "^5.0", - "symfony/http-foundation": "^5.0" - }, - "suggest": { - "illuminate/console": "Required to use the session:table command (^7.0)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Session\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Session package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2020-10-27T15:11:37+00:00" - }, - { - "name": "illuminate/support", - "version": "v7.30.6", - "source": { - "type": "git", - "url": "https://github.com/illuminate/support.git", - "reference": "c7b42acd009c94a3f8b749a65f6835db90174d58" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/support/zipball/c7b42acd009c94a3f8b749a65f6835db90174d58", - "reference": "c7b42acd009c94a3f8b749a65f6835db90174d58", - "shasum": "" - }, - "require": { - "doctrine/inflector": "^1.4|^2.0", - "ext-json": "*", - "ext-mbstring": "*", - "illuminate/contracts": "^7.0", - "nesbot/carbon": "^2.31", - "php": "^7.2.5|^8.0", - "voku/portable-ascii": "^1.4.8" - }, - "conflict": { - "tightenco/collect": "<5.5.33" - }, - "suggest": { - "illuminate/filesystem": "Required to use the composer class (^7.0).", - "moontoast/math": "Required to use ordered UUIDs (^1.1).", - "ramsey/uuid": "Required to use Str::uuid() (^3.7|^4.0).", - "symfony/process": "Required to use the composer class (^5.0).", - "symfony/var-dumper": "Required to use the dd function (^5.0).", - "vlucas/phpdotenv": "Required to use the Env class and env helper (^4.0)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "files": [ - "helpers.php" - ], - "psr-4": { - "Illuminate\\Support\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Support package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2021-12-06T19:25:06+00:00" - }, - { - "name": "illuminate/testing", - "version": "v7.30.6", - "source": { - "type": "git", - "url": "https://github.com/illuminate/testing.git", - "reference": "150fc64c2f5bc31183870ea0d691a69456ac2cac" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/testing/zipball/150fc64c2f5bc31183870ea0d691a69456ac2cac", - "reference": "150fc64c2f5bc31183870ea0d691a69456ac2cac", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^7.0", - "illuminate/support": "^7.0", - "php": "^7.2.5|^8.0", - "symfony/polyfill-php73": "^1.17" - }, - "suggest": { - "illuminate/console": "Required to assert console commands (^7.0).", - "illuminate/database": "Required to assert databases (^7.0).", - "illuminate/http": "Required to assert responses (^7.0).", - "mockery/mockery": "Required to use mocking (~1.3.3|^1.4.2).", - "phpunit/phpunit": "Required to use assertions and run tests (^8.4|^9.3.3)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Testing\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Testing package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2021-11-17T15:00:14+00:00" - }, - { - "name": "illuminate/translation", - "version": "v7.30.6", - "source": { - "type": "git", - "url": "https://github.com/illuminate/translation.git", - "reference": "3fa058d9fbac56fd53d211e43acdb107fb1d2a77" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/translation/zipball/3fa058d9fbac56fd53d211e43acdb107fb1d2a77", - "reference": "3fa058d9fbac56fd53d211e43acdb107fb1d2a77", - "shasum": "" - }, - "require": { - "ext-json": "*", - "illuminate/contracts": "^7.0", - "illuminate/filesystem": "^7.0", - "illuminate/support": "^7.0", - "php": "^7.2.5|^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Translation\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Translation package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2020-10-27T15:11:37+00:00" - }, - { - "name": "illuminate/validation", - "version": "v7.30.6", - "source": { - "type": "git", - "url": "https://github.com/illuminate/validation.git", - "reference": "0520da7549fb4b16b1948357b2328e1cc8d234c6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/validation/zipball/0520da7549fb4b16b1948357b2328e1cc8d234c6", - "reference": "0520da7549fb4b16b1948357b2328e1cc8d234c6", - "shasum": "" - }, - "require": { - "egulias/email-validator": "^2.1.10", - "ext-json": "*", - "illuminate/container": "^7.0", - "illuminate/contracts": "^7.0", - "illuminate/support": "^7.0", - "illuminate/translation": "^7.0", - "php": "^7.2.5|^8.0", - "symfony/http-foundation": "^5.0", - "symfony/mime": "^5.0" - }, - "suggest": { - "illuminate/database": "Required to use the database presence verifier (^7.0)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Validation\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Validation package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2021-12-06T19:27:14+00:00" - }, - { - "name": "illuminate/view", - "version": "v7.30.6", - "source": { - "type": "git", - "url": "https://github.com/illuminate/view.git", - "reference": "098e583d43c8fd1d3505ed83b2d54a31ce20bcdb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/view/zipball/098e583d43c8fd1d3505ed83b2d54a31ce20bcdb", - "reference": "098e583d43c8fd1d3505ed83b2d54a31ce20bcdb", - "shasum": "" - }, - "require": { - "ext-json": "*", - "illuminate/container": "^7.0", - "illuminate/contracts": "^7.0", - "illuminate/events": "^7.0", - "illuminate/filesystem": "^7.0", - "illuminate/support": "^7.0", - "php": "^7.2.5|^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\View\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate View package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2021-12-06T19:25:06+00:00" - }, - { - "name": "laravel/lumen-framework", - "version": "v7.2.2", - "source": { - "type": "git", - "url": "https://github.com/laravel/lumen-framework.git", - "reference": "613c9c02dd9632f18c6e2542a289cb37a98c939f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/lumen-framework/zipball/613c9c02dd9632f18c6e2542a289cb37a98c939f", - "reference": "613c9c02dd9632f18c6e2542a289cb37a98c939f", - "shasum": "" - }, - "require": { - "dragonmantank/cron-expression": "^2.0", - "illuminate/auth": "^7.0", - "illuminate/broadcasting": "^7.0", - "illuminate/bus": "^7.0", - "illuminate/cache": "^7.0", - "illuminate/config": "^7.0", - "illuminate/console": "^7.0", - "illuminate/container": "^7.0", - "illuminate/contracts": "^7.0", - "illuminate/database": "^7.0", - "illuminate/encryption": "^7.0", - "illuminate/events": "^7.0", - "illuminate/filesystem": "^7.0", - "illuminate/hashing": "^7.0", - "illuminate/http": "^7.0", - "illuminate/log": "^7.0", - "illuminate/pagination": "^7.0", - "illuminate/pipeline": "^7.0", - "illuminate/queue": "^7.0", - "illuminate/support": "^7.0", - "illuminate/testing": "^7.0", - "illuminate/translation": "^7.0", - "illuminate/validation": "^7.0", - "illuminate/view": "^7.0", - "nikic/fast-route": "^1.3", - "php": "^7.2.5", - "symfony/console": "^5.0", - "symfony/error-handler": "^5.0", - "symfony/http-foundation": "^5.0", - "symfony/http-kernel": "^5.0", - "symfony/mime": "^5.0", - "symfony/var-dumper": "^5.0", - "vlucas/phpdotenv": "^4.0" - }, - "require-dev": { - "mockery/mockery": "^1.0", - "phpunit/phpunit": "^8.4|^9.0" - }, - "suggest": { - "laravel/tinker": "Required to use the tinker console command (^2.0).", - "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", - "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "files": [ - "src/helpers.php" - ], - "psr-4": { - "Laravel\\Lumen\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylorotwell@gmail.com" - } - ], - "description": "The Laravel Lumen Framework.", - "homepage": "https://lumen.laravel.com", - "keywords": [ - "framework", - "laravel", - "lumen" - ], - "support": { - "issues": "https://github.com/laravel/lumen-framework/issues", - "source": "https://github.com/laravel/lumen-framework" - }, - "time": "2020-09-15T14:53:08+00:00" - }, - { - "name": "monolog/monolog", - "version": "2.6.0", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "247918972acd74356b0a91dfaa5adcaec069b6c0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/247918972acd74356b0a91dfaa5adcaec069b6c0", - "reference": "247918972acd74356b0a91dfaa5adcaec069b6c0", - "shasum": "" - }, - "require": { - "php": ">=7.2", - "psr/log": "^1.0.1 || ^2.0 || ^3.0" - }, - "provide": { - "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" - }, - "require-dev": { - "aws/aws-sdk-php": "^2.4.9 || ^3.0", - "doctrine/couchdb": "~1.0@dev", - "elasticsearch/elasticsearch": "^7 || ^8", - "ext-json": "*", - "graylog2/gelf-php": "^1.4.2", - "guzzlehttp/guzzle": "^7.4", - "guzzlehttp/psr7": "^2.2", - "mongodb/mongodb": "^1.8", - "php-amqplib/php-amqplib": "~2.4 || ^3", - "php-console/php-console": "^3.1.3", - "phpspec/prophecy": "^1.15", - "phpstan/phpstan": "^0.12.91", - "phpunit/phpunit": "^8.5.14", - "predis/predis": "^1.1", - "rollbar/rollbar": "^1.3 || ^2 || ^3", - "ruflin/elastica": "^7", - "swiftmailer/swiftmailer": "^5.3|^6.0", - "symfony/mailer": "^5.4 || ^6", - "symfony/mime": "^5.4 || ^6" - }, - "suggest": { - "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", - "doctrine/couchdb": "Allow sending log messages to a CouchDB server", - "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", - "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", - "ext-mbstring": "Allow to work properly with unicode symbols", - "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", - "ext-openssl": "Required to send log messages using SSL", - "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", - "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", - "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", - "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", - "php-console/php-console": "Allow sending log messages to Google Chrome", - "rollbar/rollbar": "Allow sending log messages to Rollbar", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Monolog\\": "src/Monolog" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" - } - ], - "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "homepage": "https://github.com/Seldaek/monolog", - "keywords": [ - "log", - "logging", - "psr-3" - ], - "support": { - "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.6.0" - }, - "funding": [ - { - "url": "https://github.com/Seldaek", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", - "type": "tidelift" - } - ], - "time": "2022-05-10T09:36:00+00:00" - }, - { - "name": "nesbot/carbon", - "version": "2.58.0", - "source": { - "type": "git", - "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "97a34af22bde8d0ac20ab34b29d7bfe360902055" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/97a34af22bde8d0ac20ab34b29d7bfe360902055", - "reference": "97a34af22bde8d0ac20ab34b29d7bfe360902055", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": "^7.1.8 || ^8.0", - "symfony/polyfill-mbstring": "^1.0", - "symfony/polyfill-php80": "^1.16", - "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" - }, - "require-dev": { - "doctrine/dbal": "^2.0 || ^3.0", - "doctrine/orm": "^2.7", - "friendsofphp/php-cs-fixer": "^3.0", - "kylekatarnls/multi-tester": "^2.0", - "phpmd/phpmd": "^2.9", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12.54 || ^1.0", - "phpunit/php-file-iterator": "^2.0.5", - "phpunit/phpunit": "^7.5.20 || ^8.5.23", - "squizlabs/php_codesniffer": "^3.4" - }, - "bin": [ - "bin/carbon" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-3.x": "3.x-dev", - "dev-master": "2.x-dev" - }, - "laravel": { - "providers": [ - "Carbon\\Laravel\\ServiceProvider" - ] - }, - "phpstan": { - "includes": [ - "extension.neon" - ] - } - }, - "autoload": { - "psr-4": { - "Carbon\\": "src/Carbon/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Brian Nesbitt", - "email": "brian@nesbot.com", - "homepage": "https://markido.com" - }, - { - "name": "kylekatarnls", - "homepage": "https://github.com/kylekatarnls" - } - ], - "description": "An API extension for DateTime that supports 281 different languages.", - "homepage": "https://carbon.nesbot.com", - "keywords": [ - "date", - "datetime", - "time" - ], - "support": { - "docs": "https://carbon.nesbot.com/docs", - "issues": "https://github.com/briannesbitt/Carbon/issues", - "source": "https://github.com/briannesbitt/Carbon" - }, - "funding": [ - { - "url": "https://opencollective.com/Carbon", - "type": "open_collective" - }, - { - "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", - "type": "tidelift" - } - ], - "time": "2022-04-25T19:31:17+00:00" - }, - { - "name": "nikic/fast-route", - "version": "v1.3.0", - "source": { - "type": "git", - "url": "https://github.com/nikic/FastRoute.git", - "reference": "181d480e08d9476e61381e04a71b34dc0432e812" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", - "reference": "181d480e08d9476e61381e04a71b34dc0432e812", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35|~5.7" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "FastRoute\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov", - "email": "nikic@php.net" - } - ], - "description": "Fast request router for PHP", - "keywords": [ - "router", - "routing" - ], - "support": { - "issues": "https://github.com/nikic/FastRoute/issues", - "source": "https://github.com/nikic/FastRoute/tree/master" - }, - "time": "2018-02-13T20:26:39+00:00" - }, - { - "name": "opis/closure", - "version": "3.6.3", - "source": { - "type": "git", - "url": "https://github.com/opis/closure.git", - "reference": "3d81e4309d2a927abbe66df935f4bb60082805ad" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/opis/closure/zipball/3d81e4309d2a927abbe66df935f4bb60082805ad", - "reference": "3d81e4309d2a927abbe66df935f4bb60082805ad", - "shasum": "" - }, - "require": { - "php": "^5.4 || ^7.0 || ^8.0" - }, - "require-dev": { - "jeremeamia/superclosure": "^2.0", - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.6.x-dev" - } - }, - "autoload": { - "files": [ - "functions.php" - ], - "psr-4": { - "Opis\\Closure\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marius Sarca", - "email": "marius.sarca@gmail.com" - }, - { - "name": "Sorin Sarca", - "email": "sarca_sorin@hotmail.com" - } - ], - "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.", - "homepage": "https://opis.io/closure", - "keywords": [ - "anonymous functions", - "closure", - "function", - "serializable", - "serialization", - "serialize" - ], - "support": { - "issues": "https://github.com/opis/closure/issues", - "source": "https://github.com/opis/closure/tree/3.6.3" - }, - "time": "2022-01-27T09:35:39+00:00" - }, - { - "name": "phpoption/phpoption", - "version": "1.8.1", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/php-option.git", - "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15", - "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", - "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.8-dev" - } - }, - "autoload": { - "psr-4": { - "PhpOption\\": "src/PhpOption/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh" - }, - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - } - ], - "description": "Option Type for PHP", - "keywords": [ - "language", - "option", - "php", - "type" - ], - "support": { - "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.8.1" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", - "type": "tidelift" - } - ], - "time": "2021-12-04T23:24:31+00:00" - }, - { - "name": "psr/container", - "version": "1.1.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", - "shasum": "" - }, - "require": { - "php": ">=7.4.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.2" - }, - "time": "2021-11-05T16:50:12+00:00" - }, - { - "name": "psr/event-dispatcher", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\EventDispatcher\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Standard interfaces for event handling.", - "keywords": [ - "events", - "psr", - "psr-14" - ], - "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" - }, - "time": "2019-01-08T18:20:26+00:00" - }, - { - "name": "psr/http-client", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP clients", - "homepage": "https://github.com/php-fig/http-client", - "keywords": [ - "http", - "http-client", - "psr", - "psr-18" - ], - "support": { - "source": "https://github.com/php-fig/http-client/tree/master" - }, - "time": "2020-06-29T06:28:15+00:00" - }, - { - "name": "psr/http-message", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/master" - }, - "time": "2016-08-06T14:39:51+00:00" - }, - { - "name": "psr/log", - "version": "1.1.4", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" - }, - "time": "2021-05-03T11:20:27+00:00" - }, - { - "name": "psr/simple-cache", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/simple-cache.git", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\SimpleCache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interfaces for simple caching", - "keywords": [ - "cache", - "caching", - "psr", - "psr-16", - "simple-cache" - ], - "support": { - "source": "https://github.com/php-fig/simple-cache/tree/master" - }, - "time": "2017-10-23T01:57:42+00:00" - }, - { - "name": "ralouphie/getallheaders", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/getallheaders.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" - } - ], - "description": "A polyfill for getallheaders.", - "support": { - "issues": "https://github.com/ralouphie/getallheaders/issues", - "source": "https://github.com/ralouphie/getallheaders/tree/develop" - }, - "time": "2019-03-08T08:55:37+00:00" - }, - { - "name": "ramsey/collection", - "version": "1.2.2", - "source": { - "type": "git", - "url": "https://github.com/ramsey/collection.git", - "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/cccc74ee5e328031b15640b51056ee8d3bb66c0a", - "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a", - "shasum": "" - }, - "require": { - "php": "^7.3 || ^8", - "symfony/polyfill-php81": "^1.23" - }, - "require-dev": { - "captainhook/captainhook": "^5.3", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "ergebnis/composer-normalize": "^2.6", - "fakerphp/faker": "^1.5", - "hamcrest/hamcrest-php": "^2", - "jangregor/phpstan-prophecy": "^0.8", - "mockery/mockery": "^1.3", - "phpspec/prophecy-phpunit": "^2.0", - "phpstan/extension-installer": "^1", - "phpstan/phpstan": "^0.12.32", - "phpstan/phpstan-mockery": "^0.12.5", - "phpstan/phpstan-phpunit": "^0.12.11", - "phpunit/phpunit": "^8.5 || ^9", - "psy/psysh": "^0.10.4", - "slevomat/coding-standard": "^6.3", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Ramsey\\Collection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ben Ramsey", - "email": "ben@benramsey.com", - "homepage": "https://benramsey.com" - } - ], - "description": "A PHP library for representing and manipulating collections.", - "keywords": [ - "array", - "collection", - "hash", - "map", - "queue", - "set" - ], - "support": { - "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/1.2.2" - }, - "funding": [ - { - "url": "https://github.com/ramsey", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", - "type": "tidelift" - } - ], - "time": "2021-10-10T03:01:02+00:00" - }, - { - "name": "ramsey/uuid", - "version": "4.2.3", - "source": { - "type": "git", - "url": "https://github.com/ramsey/uuid.git", - "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df", - "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df", - "shasum": "" - }, - "require": { - "brick/math": "^0.8 || ^0.9", - "ext-json": "*", - "php": "^7.2 || ^8.0", - "ramsey/collection": "^1.0", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-php80": "^1.14" - }, - "replace": { - "rhumsaa/uuid": "self.version" - }, - "require-dev": { - "captainhook/captainhook": "^5.10", - "captainhook/plugin-composer": "^5.3", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "doctrine/annotations": "^1.8", - "ergebnis/composer-normalize": "^2.15", - "mockery/mockery": "^1.3", - "moontoast/math": "^1.1", - "paragonie/random-lib": "^2", - "php-mock/php-mock": "^2.2", - "php-mock/php-mock-mockery": "^1.3", - "php-parallel-lint/php-parallel-lint": "^1.1", - "phpbench/phpbench": "^1.0", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-mockery": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpunit/phpunit": "^8.5 || ^9", - "slevomat/coding-standard": "^7.0", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.9" - }, - "suggest": { - "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", - "ext-ctype": "Enables faster processing of character classification using ctype functions.", - "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", - "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", - "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", - "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.x-dev" - }, - "captainhook": { - "force-install": true - } - }, - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Ramsey\\Uuid\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", - "keywords": [ - "guid", - "identifier", - "uuid" - ], - "support": { - "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.2.3" - }, - "funding": [ - { - "url": "https://github.com/ramsey", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", - "type": "tidelift" - } - ], - "time": "2021-09-25T23:10:38+00:00" - }, - { - "name": "rap2hpoutre/laravel-log-viewer", - "version": "v1.7.0", - "source": { - "type": "git", - "url": "https://github.com/rap2hpoutre/laravel-log-viewer.git", - "reference": "27392d29234b6ff38a456454558f4bcc40cc837a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/rap2hpoutre/laravel-log-viewer/zipball/27392d29234b6ff38a456454558f4bcc40cc837a", - "reference": "27392d29234b6ff38a456454558f4bcc40cc837a", - "shasum": "" - }, - "require": { - "illuminate/support": "4.2.*|5.*|^6.0|^7.0|^8.0", - "php": ">=5.4.0" - }, - "require-dev": { - "orchestra/testbench": "3.7.*", - "phpunit/phpunit": "^7" - }, - "type": "laravel-package", - "extra": { - "laravel": { - "providers": [ - "Rap2hpoutre\\LaravelLogViewer\\LaravelLogViewerServiceProvider" - ] - } - }, - "autoload": { - "psr-0": { - "Rap2hpoutre\\LaravelLogViewer\\": "src/" - }, - "classmap": [ - "src/controllers" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "rap2hpoutre", - "email": "raphaelht@gmail.com" - } - ], - "description": "A Laravel log reader", - "keywords": [ - "laravel", - "log", - "log-reader", - "log-viewer", - "logging", - "lumen" - ], - "support": { - "issues": "https://github.com/rap2hpoutre/laravel-log-viewer/issues", - "source": "https://github.com/rap2hpoutre/laravel-log-viewer/tree/master" - }, - "time": "2020-09-08T12:21:27+00:00" - }, - { - "name": "symfony/console", - "version": "v5.4.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "829d5d1bf60b2efeb0887b7436873becc71a45eb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/829d5d1bf60b2efeb0887b7436873becc71a45eb", - "reference": "829d5d1bf60b2efeb0887b7436873becc71a45eb", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.1|^6.0" - }, - "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0" - }, - "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/lock": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command line", - "console", - "terminal" - ], - "support": { - "source": "https://github.com/symfony/console/tree/v5.4.9" - }, - "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": "2022-05-18T06:17:34+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v2.5.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.1" - }, - "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": "2022-01-02T09:53:40+00:00" - }, - { - "name": "symfony/error-handler", - "version": "v5.4.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/error-handler.git", - "reference": "c116cda1f51c678782768dce89a45f13c949455d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/c116cda1f51c678782768dce89a45f13c949455d", - "reference": "c116cda1f51c678782768dce89a45f13c949455d", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^4.4|^5.0|^6.0" - }, - "require-dev": { - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/http-kernel": "^4.4|^5.0|^6.0", - "symfony/serializer": "^4.4|^5.0|^6.0" - }, - "bin": [ - "Resources/bin/patch-type-declarations" - ], - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\ErrorHandler\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides tools to manage errors and ease debugging PHP code", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.4.9" - }, - "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": "2022-05-21T13:57:48+00:00" - }, - { - "name": "symfony/event-dispatcher", - "version": "v5.4.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", - "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/event-dispatcher-contracts": "^2|^3", - "symfony/polyfill-php80": "^1.16" - }, - "conflict": { - "symfony/dependency-injection": "<4.4" - }, - "provide": { - "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0" - }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/http-foundation": "^4.4|^5.0|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/stopwatch": "^4.4|^5.0|^6.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.9" - }, - "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": "2022-05-05T16:45:39+00:00" - }, - { - "name": "symfony/event-dispatcher-contracts", - "version": "v2.5.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1", - "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/event-dispatcher": "^1" - }, - "suggest": { - "symfony/event-dispatcher-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\EventDispatcher\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to dispatching event", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.1" - }, - "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": "2022-01-02T09:53:40+00:00" - }, - { - "name": "symfony/finder", - "version": "v5.4.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/9b630f3427f3ebe7cd346c277a1408b00249dad9", - "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Finds files and directories via an intuitive fluent interface", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.8" - }, - "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": "2022-04-15T08:07:45+00:00" - }, - { - "name": "symfony/http-foundation", - "version": "v5.4.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "6b0d0e4aca38d57605dcd11e2416994b38774522" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6b0d0e4aca38d57605dcd11e2416994b38774522", - "reference": "6b0d0e4aca38d57605dcd11e2416994b38774522", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php80": "^1.16" - }, - "require-dev": { - "predis/predis": "~1.0", - "symfony/cache": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/mime": "^4.4|^5.0|^6.0" - }, - "suggest": { - "symfony/mime": "To use the file extension guesser" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Defines an object-oriented layer for the HTTP specification", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.9" - }, - "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": "2022-05-17T15:07:29+00:00" - }, - { - "name": "symfony/http-kernel", - "version": "v5.4.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-kernel.git", - "reference": "34b121ad3dc761f35fe1346d2f15618f8cbf77f8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/34b121ad3dc761f35fe1346d2f15618f8cbf77f8", - "reference": "34b121ad3dc761f35fe1346d2f15618f8cbf77f8", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/log": "^1|^2", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^5.0|^6.0", - "symfony/http-foundation": "^5.3.7|^6.0", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16" - }, - "conflict": { - "symfony/browser-kit": "<5.4", - "symfony/cache": "<5.0", - "symfony/config": "<5.0", - "symfony/console": "<4.4", - "symfony/dependency-injection": "<5.3", - "symfony/doctrine-bridge": "<5.0", - "symfony/form": "<5.0", - "symfony/http-client": "<5.0", - "symfony/mailer": "<5.0", - "symfony/messenger": "<5.0", - "symfony/translation": "<5.0", - "symfony/twig-bridge": "<5.0", - "symfony/validator": "<5.0", - "twig/twig": "<2.13" - }, - "provide": { - "psr/log-implementation": "1.0|2.0" - }, - "require-dev": { - "psr/cache": "^1.0|^2.0|^3.0", - "symfony/browser-kit": "^5.4|^6.0", - "symfony/config": "^5.0|^6.0", - "symfony/console": "^4.4|^5.0|^6.0", - "symfony/css-selector": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^5.3|^6.0", - "symfony/dom-crawler": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/finder": "^4.4|^5.0|^6.0", - "symfony/http-client-contracts": "^1.1|^2|^3", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/routing": "^4.4|^5.0|^6.0", - "symfony/stopwatch": "^4.4|^5.0|^6.0", - "symfony/translation": "^4.4|^5.0|^6.0", - "symfony/translation-contracts": "^1.1|^2|^3", - "twig/twig": "^2.13|^3.0.4" - }, - "suggest": { - "symfony/browser-kit": "", - "symfony/config": "", - "symfony/console": "", - "symfony/dependency-injection": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpKernel\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides a structured process for converting a Request into a Response", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.4.9" - }, - "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": "2022-05-27T07:09:08+00:00" - }, - { - "name": "symfony/mime", - "version": "v5.4.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/mime.git", - "reference": "2b3802a24e48d0cfccf885173d2aac91e73df92e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/2b3802a24e48d0cfccf885173d2aac91e73df92e", - "reference": "2b3802a24e48d0cfccf885173d2aac91e73df92e", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0", - "symfony/polyfill-php80": "^1.16" - }, - "conflict": { - "egulias/email-validator": "~3.0.0", - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<4.4" - }, - "require-dev": { - "egulias/email-validator": "^2.1.10|^3.1", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/property-access": "^4.4|^5.1|^6.0", - "symfony/property-info": "^4.4|^5.1|^6.0", - "symfony/serializer": "^5.2|^6.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Mime\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Allows manipulating MIME messages", - "homepage": "https://symfony.com", - "keywords": [ - "mime", - "mime-type" - ], - "support": { - "source": "https://github.com/symfony/mime/tree/v5.4.9" - }, - "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": "2022-05-21T10:24:18+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "30885182c981ab175d4d034db0f6f469898070ab" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab", - "reference": "30885182c981ab175d4d034db0f6f469898070ab", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-ctype": "*" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.25.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": "2021-10-20T20:35:02+00:00" - }, - { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "81b86b50cf841a64252b439e738e97f4a34e2783" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/81b86b50cf841a64252b439e738e97f4a34e2783", - "reference": "81b86b50cf841a64252b439e738e97f4a34e2783", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.25.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": "2021-11-23T21:10:46+00:00" - }, - { - "name": "symfony/polyfill-intl-idn", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "749045c69efb97c70d25d7463abba812e91f3a44" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/749045c69efb97c70d25d7463abba812e91f3a44", - "reference": "749045c69efb97c70d25d7463abba812e91f3a44", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Laurent Bassin", - "email": "laurent@bassin.info" - }, - { - "name": "Trevor Rowbotham", - "email": "trevor.rowbotham@pm.me" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "idn", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.25.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": "2021-09-14T14:02:44+00:00" - }, - { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.25.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": "2021-02-19T12:13:01+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/0abb51d2f102e00a4eefcf46ba7fec406d245825", - "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.25.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": "2021-11-30T18:21:41+00:00" - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.25.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": "2021-05-27T09:17:38+00:00" - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/cc5db0e22b3cb4111010e48785a97f670b350ca5", - "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.25.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": "2021-06-05T21:20:04+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/4407588e0d3f1f52efb65fbe92babe41f37fe50c", - "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.25.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": "2022-03-04T08:16:47+00:00" - }, - { - "name": "symfony/polyfill-php81", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/5de4ba2d41b15f9bd0e19b2ab9674135813ec98f", - "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.25.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": "2021-09-13T13:58:11+00:00" - }, - { - "name": "symfony/process", - "version": "v5.4.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/597f3fff8e3e91836bb0bd38f5718b56ddbde2f3", - "reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Executes commands in sub-processes", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/process/tree/v5.4.8" - }, - "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": "2022-04-08T05:07:18+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "v2.5.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/24d9dc654b83e91aa59f9d167b131bc3b5bea24c", - "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1|^3" - }, - "conflict": { - "ext-psr": "<1.1|>=2" - }, - "suggest": { - "symfony/service-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.1" - }, - "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": "2022-03-13T20:07:29+00:00" - }, - { - "name": "symfony/string", - "version": "v5.4.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "985e6a9703ef5ce32ba617c9c7d97873bb7b2a99" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/985e6a9703ef5ce32ba617c9c7d97873bb7b2a99", - "reference": "985e6a9703ef5ce32ba617c9c7d97873bb7b2a99", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" - }, - "conflict": { - "symfony/translation-contracts": ">=3.0" - }, - "require-dev": { - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/http-client": "^4.4|^5.0|^6.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0|^6.0" - }, - "type": "library", - "autoload": { - "files": [ - "Resources/functions.php" - ], - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "support": { - "source": "https://github.com/symfony/string/tree/v5.4.9" - }, - "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": "2022-04-19T10:40:37+00:00" - }, - { - "name": "symfony/translation", - "version": "v5.4.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation.git", - "reference": "1639abc1177d26bcd4320e535e664cef067ab0ca" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/1639abc1177d26bcd4320e535e664cef067ab0ca", - "reference": "1639abc1177d26bcd4320e535e664cef067ab0ca", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.16", - "symfony/translation-contracts": "^2.3" - }, - "conflict": { - "symfony/config": "<4.4", - "symfony/console": "<5.3", - "symfony/dependency-injection": "<5.0", - "symfony/http-kernel": "<5.0", - "symfony/twig-bundle": "<5.0", - "symfony/yaml": "<4.4" - }, - "provide": { - "symfony/translation-implementation": "2.3" - }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/console": "^5.4|^6.0", - "symfony/dependency-injection": "^5.0|^6.0", - "symfony/finder": "^4.4|^5.0|^6.0", - "symfony/http-client-contracts": "^1.1|^2.0|^3.0", - "symfony/http-kernel": "^5.0|^6.0", - "symfony/intl": "^4.4|^5.0|^6.0", - "symfony/polyfill-intl-icu": "^1.21", - "symfony/service-contracts": "^1.1.2|^2|^3", - "symfony/yaml": "^4.4|^5.0|^6.0" - }, - "suggest": { - "psr/log-implementation": "To use logging capability in translator", - "symfony/config": "", - "symfony/yaml": "" - }, - "type": "library", - "autoload": { - "files": [ - "Resources/functions.php" - ], - "psr-4": { - "Symfony\\Component\\Translation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides tools to internationalize your application", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/translation/tree/v5.4.9" - }, - "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": "2022-05-06T12:33:37+00:00" - }, - { - "name": "symfony/translation-contracts", - "version": "v2.5.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation-contracts.git", - "reference": "1211df0afa701e45a04253110e959d4af4ef0f07" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/1211df0afa701e45a04253110e959d4af4ef0f07", - "reference": "1211df0afa701e45a04253110e959d4af4ef0f07", - "shasum": "" - }, - "require": { - "php": ">=7.2.5" - }, - "suggest": { - "symfony/translation-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Translation\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to translation", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v2.5.1" - }, - "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": "2022-01-02T09:53:40+00:00" - }, - { - "name": "symfony/var-dumper", - "version": "v5.4.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "af52239a330fafd192c773795520dc2dd62b5657" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/af52239a330fafd192c773795520dc2dd62b5657", - "reference": "af52239a330fafd192c773795520dc2dd62b5657", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.16" - }, - "conflict": { - "phpunit/phpunit": "<5.4.3", - "symfony/console": "<4.4" - }, - "require-dev": { - "ext-iconv": "*", - "symfony/console": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/uid": "^5.1|^6.0", - "twig/twig": "^2.13|^3.0.4" - }, - "suggest": { - "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "ext-intl": "To show region name in time zone dump", - "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" - }, - "bin": [ - "Resources/bin/var-dump-server" - ], - "type": "library", - "autoload": { - "files": [ - "Resources/functions/dump.php" - ], - "psr-4": { - "Symfony\\Component\\VarDumper\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides mechanisms for walking through any arbitrary PHP variable", - "homepage": "https://symfony.com", - "keywords": [ - "debug", - "dump" - ], - "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.4.9" - }, - "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": "2022-05-21T10:24:18+00:00" - }, - { - "name": "vlucas/phpdotenv", - "version": "v4.2.2", - "source": { - "type": "git", - "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "77e974614d2ead521f18069dccc571696f52b8dc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/77e974614d2ead521f18069dccc571696f52b8dc", - "reference": "77e974614d2ead521f18069dccc571696f52b8dc", - "shasum": "" - }, - "require": { - "php": "^5.5.9 || ^7.0 || ^8.0", - "phpoption/phpoption": "^1.7.3", - "symfony/polyfill-ctype": "^1.17" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", - "ext-filter": "*", - "ext-pcre": "*", - "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.21" - }, - "suggest": { - "ext-filter": "Required to use the boolean validator.", - "ext-pcre": "Required to use most of the library." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.2-dev" - } - }, - "autoload": { - "psr-4": { - "Dotenv\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Vance Lucas", - "email": "vance@vancelucas.com", - "homepage": "https://github.com/vlucas" - } - ], - "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", - "keywords": [ - "dotenv", - "env", - "environment" - ], - "support": { - "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v4.2.2" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", - "type": "tidelift" - } - ], - "time": "2021-12-12T23:07:53+00:00" - }, - { - "name": "voku/portable-ascii", - "version": "1.6.1", - "source": { - "type": "git", - "url": "https://github.com/voku/portable-ascii.git", - "reference": "87337c91b9dfacee02452244ee14ab3c43bc485a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/87337c91b9dfacee02452244ee14ab3c43bc485a", - "reference": "87337c91b9dfacee02452244ee14ab3c43bc485a", - "shasum": "" - }, - "require": { - "php": ">=7.0.0" - }, - "require-dev": { - "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" - }, - "suggest": { - "ext-intl": "Use Intl for transliterator_transliterate() support" - }, - "type": "library", - "autoload": { - "psr-4": { - "voku\\": "src/voku/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Lars Moelleken", - "homepage": "http://www.moelleken.org/" - } - ], - "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", - "homepage": "https://github.com/voku/portable-ascii", - "keywords": [ - "ascii", - "clean", - "php" - ], - "support": { - "issues": "https://github.com/voku/portable-ascii/issues", - "source": "https://github.com/voku/portable-ascii/tree/1.6.1" - }, - "funding": [ - { - "url": "https://www.paypal.me/moelleken", - "type": "custom" - }, - { - "url": "https://github.com/voku", - "type": "github" - }, - { - "url": "https://opencollective.com/portable-ascii", - "type": "open_collective" - }, - { - "url": "https://www.patreon.com/voku", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", - "type": "tidelift" - } - ], - "time": "2022-01-24T18:55:24+00:00" - } - ], - "packages-dev": [ - { - "name": "doctrine/instantiator", - "version": "1.4.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^0.16 || ^1", - "phpstan/phpstan": "^1.4", - "phpstan/phpstan-phpunit": "^1", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.22" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.1" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", - "type": "tidelift" - } - ], - "time": "2022-03-03T08:28:38+00:00" - }, - { - "name": "fzaninotto/faker", - "version": "v1.9.2", - "source": { - "type": "git", - "url": "https://github.com/fzaninotto/Faker.git", - "reference": "848d8125239d7dbf8ab25cb7f054f1a630e68c2e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/848d8125239d7dbf8ab25cb7f054f1a630e68c2e", - "reference": "848d8125239d7dbf8ab25cb7f054f1a630e68c2e", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0" - }, - "require-dev": { - "ext-intl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7", - "squizlabs/php_codesniffer": "^2.9.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9-dev" - } - }, - "autoload": { - "psr-4": { - "Faker\\": "src/Faker/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "François Zaninotto" - } - ], - "description": "Faker is a PHP library that generates fake data for you.", - "keywords": [ - "data", - "faker", - "fixtures" - ], - "support": { - "issues": "https://github.com/fzaninotto/Faker/issues", - "source": "https://github.com/fzaninotto/Faker/tree/v1.9.2" - }, - "abandoned": true, - "time": "2020-12-11T09:56:16+00:00" - }, - { - "name": "hamcrest/hamcrest-php", - "version": "v2.0.1", - "source": { - "type": "git", - "url": "https://github.com/hamcrest/hamcrest-php.git", - "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", - "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", - "shasum": "" - }, - "require": { - "php": "^5.3|^7.0|^8.0" - }, - "replace": { - "cordoval/hamcrest-php": "*", - "davedevelopment/hamcrest-php": "*", - "kodova/hamcrest-php": "*" - }, - "require-dev": { - "phpunit/php-file-iterator": "^1.4 || ^2.0", - "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - } - }, - "autoload": { - "classmap": [ - "hamcrest" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "This is the PHP port of Hamcrest Matchers", - "keywords": [ - "test" - ], - "support": { - "issues": "https://github.com/hamcrest/hamcrest-php/issues", - "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" - }, - "time": "2020-07-09T08:09:16+00:00" - }, - { - "name": "mockery/mockery", - "version": "1.5.0", - "source": { - "type": "git", - "url": "https://github.com/mockery/mockery.git", - "reference": "c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac", - "reference": "c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac", - "shasum": "" - }, - "require": { - "hamcrest/hamcrest-php": "^2.0.1", - "lib-pcre": ">=7.0", - "php": "^7.3 || ^8.0" - }, - "conflict": { - "phpunit/phpunit": "<8.0" - }, - "require-dev": { - "phpunit/phpunit": "^8.5 || ^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, - "autoload": { - "psr-0": { - "Mockery": "library/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Pádraic Brady", - "email": "padraic.brady@gmail.com", - "homepage": "http://blog.astrumfutura.com" - }, - { - "name": "Dave Marshall", - "email": "dave.marshall@atstsolutions.co.uk", - "homepage": "http://davedevelopment.co.uk" - } - ], - "description": "Mockery is a simple yet flexible PHP mock object framework", - "homepage": "https://github.com/mockery/mockery", - "keywords": [ - "BDD", - "TDD", - "library", - "mock", - "mock objects", - "mockery", - "stub", - "test", - "test double", - "testing" - ], - "support": { - "issues": "https://github.com/mockery/mockery/issues", - "source": "https://github.com/mockery/mockery/tree/1.5.0" - }, - "time": "2022-01-20T13:18:17+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.11.0", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3,<3.2.2" - }, - "require-dev": { - "doctrine/collections": "^1.6.8", - "doctrine/common": "^2.13.3 || ^3.2.2", - "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" - }, - "type": "library", - "autoload": { - "files": [ - "src/DeepCopy/deep_copy.php" - ], - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2022-03-03T13:19:32+00:00" - }, - { - "name": "phar-io/manifest", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.3" - }, - "time": "2021-07-20T11:28:43+00:00" - }, - { - "name": "phar-io/version", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" - }, - "time": "2022-02-21T01:04:05+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" - }, - "time": "2020-06-27T09:03:43+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.3.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" - }, - "time": "2021-10-19T17:43:47+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.6.1", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "77a32518733312af16a44300404e945338981de3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", - "reference": "77a32518733312af16a44300404e945338981de3", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "*", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1" - }, - "time": "2022-03-15T21:29:03+00:00" - }, - { - "name": "phpspec/prophecy", - "version": "v1.15.0", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.2", - "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" - }, - "require-dev": { - "phpspec/phpspec": "^6.0 || ^7.0", - "phpunit/phpunit": "^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/v1.15.0" - }, - "time": "2021-12-08T12:19:24+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "7.0.15", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "819f92bba8b001d4363065928088de22f25a3a48" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/819f92bba8b001d4363065928088de22f25a3a48", - "reference": "819f92bba8b001d4363065928088de22f25a3a48", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-xmlwriter": "*", - "php": ">=7.2", - "phpunit/php-file-iterator": "^2.0.2", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^3.1.3 || ^4.0", - "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^4.2.2", - "sebastian/version": "^2.0.1", - "theseer/tokenizer": "^1.1.3" - }, - "require-dev": { - "phpunit/phpunit": "^8.2.2" - }, - "suggest": { - "ext-xdebug": "^2.7.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/7.0.15" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2021-07-26T12:20:09+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "2.0.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5", - "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "^8.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.5" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2021-12-02T12:42:26+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1" - }, - "time": "2015-06-21T13:50:34+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "2.1.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/2454ae1765516d20c4ffe103d85a58a9a3bd5662", - "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "^8.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/2.1.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-30T08:20:02+00:00" - }, - { - "name": "phpunit/php-token-stream", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/a853a0e183b9db7eed023d7933a858fa1c8d25a3", - "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "keywords": [ - "tokenizer" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-token-stream/issues", - "source": "https://github.com/sebastianbergmann/php-token-stream/tree/master" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "abandoned": true, - "time": "2020-08-04T08:28:15+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "8.5.26", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "ef117c59fc4c54a979021b26d08a3373e386606d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/ef117c59fc4c54a979021b26d08a3373e386606d", - "reference": "ef117c59fc4c54a979021b26d08a3373e386606d", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.3.1", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.0", - "phar-io/manifest": "^2.0.3", - "phar-io/version": "^3.0.2", - "php": ">=7.2", - "phpspec/prophecy": "^1.10.3", - "phpunit/php-code-coverage": "^7.0.12", - "phpunit/php-file-iterator": "^2.0.4", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^2.1.2", - "sebastian/comparator": "^3.0.2", - "sebastian/diff": "^3.0.2", - "sebastian/environment": "^4.2.3", - "sebastian/exporter": "^3.1.2", - "sebastian/global-state": "^3.0.0", - "sebastian/object-enumerator": "^3.0.3", - "sebastian/resource-operations": "^2.0.1", - "sebastian/type": "^1.1.3", - "sebastian/version": "^2.0.1" - }, - "require-dev": { - "ext-pdo": "*" - }, - "suggest": { - "ext-soap": "*", - "ext-xdebug": "*", - "phpunit/php-invoker": "^2.0.0" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "8.5-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.26" - }, - "funding": [ - { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2022-04-01T12:34:39+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619", - "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "phpunit/phpunit": "^8.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-30T08:15:22+00:00" - }, - { - "name": "sebastian/comparator", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "1071dfcef776a57013124ff35e1fc41ccd294758" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1071dfcef776a57013124ff35e1fc41ccd294758", - "reference": "1071dfcef776a57013124ff35e1fc41ccd294758", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "sebastian/diff": "^3.0", - "sebastian/exporter": "^3.1" - }, - "require-dev": { - "phpunit/phpunit": "^8.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-30T08:04:30+00:00" - }, - { - "name": "sebastian/diff", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/14f72dd46eaf2f2293cbe79c93cc0bc43161a211", - "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.5 || ^8.0", - "symfony/process": "^2 || ^3.3 || ^4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/3.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-30T07:59:04+00:00" - }, - { - "name": "sebastian/environment", - "version": "4.2.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", - "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.5" - }, - "suggest": { - "ext-posix": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/4.2.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-30T07:53:42+00:00" - }, - { - "name": "sebastian/exporter", - "version": "3.1.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "0c32ea2e40dbf59de29f3b49bf375176ce7dd8db" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0c32ea2e40dbf59de29f3b49bf375176ce7dd8db", - "reference": "0c32ea2e40dbf59de29f3b49bf375176ce7dd8db", - "shasum": "" - }, - "require": { - "php": ">=7.0", - "sebastian/recursion-context": "^3.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^8.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2021-11-11T13:51:24+00:00" - }, - { - "name": "sebastian/global-state", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "de036ec91d55d2a9e0db2ba975b512cdb1c23921" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/de036ec91d55d2a9e0db2ba975b512cdb1c23921", - "reference": "de036ec91d55d2a9e0db2ba975b512cdb1c23921", - "shasum": "" - }, - "require": { - "php": ">=7.2", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^8.0" - }, - "suggest": { - "ext-uopz": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/3.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2022-02-10T06:55:38+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "3.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", - "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", - "shasum": "" - }, - "require": { - "php": ">=7.0", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-30T07:40:27+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "1.1.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", - "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", - "shasum": "" - }, - "require": { - "php": ">=7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-30T07:37:18+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "3.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/367dcba38d6e1977be014dc4b22f47a484dac7fb", - "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb", - "shasum": "" - }, - "require": { - "php": ">=7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-30T07:34:24+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/31d35ca87926450c44eae7e2611d45a7a65ea8b3", - "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/2.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-30T07:30:19+00:00" - }, - { - "name": "sebastian/type", - "version": "1.1.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "0150cfbc4495ed2df3872fb31b26781e4e077eb4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/0150cfbc4495ed2df3872fb31b26781e4e077eb4", - "reference": "0150cfbc4495ed2df3872fb31b26781e4e077eb4", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", - "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/1.1.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-30T07:25:11+00:00" - }, - { - "name": "sebastian/version", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/master" - }, - "time": "2016-10-03T07:35:21+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.1" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2021-07-28T10:34:58+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.10.0", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.10.0" - }, - "time": "2021-03-09T10:59:23+00:00" - } - ], - "aliases": [], - "minimum-stability": "dev", - "stability-flags": [], - "prefer-stable": true, - "prefer-lowest": false, - "platform": { - "php": "^7.2.5" - }, - "platform-dev": [], - "plugin-api-version": "2.3.0" -} diff --git a/config/app_parameter.php b/config/app_parameter.php index b9b4014..bf9e75b 100644 --- a/config/app_parameter.php +++ b/config/app_parameter.php @@ -3,6 +3,7 @@ return [ 'url' => env('APP_URL', 'http://localhost'), 'api_arrahnbid' => env('API_ARRAHNBID', 'http://lelong.test/api/'), + 'api_arrahnbid_annur' => env('API_ARRAHNBID_ANNUR', env('API_ARRAHNBID', 'http://lelong.test/api/')), 'api_v3' => env('API_V3', 'http://apiv3.localhost/api/') ]; diff --git a/config/kaunter.php b/config/kaunter.php new file mode 100644 index 0000000..5ba78cc --- /dev/null +++ b/config/kaunter.php @@ -0,0 +1,7 @@ + env('KAUNTER_URL', ''), + 'notification_secret' => env('INTERNAL_NOTIFICATION_SECRET', ''), + 'notification_timeout' => (int) env('KAUNTER_NOTIFICATION_TIMEOUT', 3), +]; diff --git a/config/logviewer.php b/config/logviewer.php new file mode 100644 index 0000000..5746448 --- /dev/null +++ b/config/logviewer.php @@ -0,0 +1,16 @@ + env('LOGVIEWER_PASSWORD'), + /* + |-------------------------------------------------------------------------- + | Pattern and storage path settings + |-------------------------------------------------------------------------- + | + | The env key for pattern and storage path with a default value + | + */ + 'max_file_size' => 52428800, // size in Byte + 'pattern' => env('LOGVIEWER_PATTERN', '*.log'), + 'storage_path' => env('LOGVIEWER_STORAGE_PATH', storage_path('logs')), +]; diff --git a/config/whatsapp.php b/config/whatsapp.php new file mode 100644 index 0000000..9dce1c7 --- /dev/null +++ b/config/whatsapp.php @@ -0,0 +1,12 @@ + env('WHATSAPP_CLOUD_ENABLED', true), + 'token' => env('WHATSAPP_TOKEN'), + 'phone_number_id' => env('WHATSAPP_PHONE_NUMBER_ID'), + 'api_version' => env('WHATSAPP_API_VERSION', 'v25.0'), + 'template' => env('WHATSAPP_TEMPLATE', 'hello_world'), + 'template_lang' => env('WHATSAPP_TEMPLATE_LANG', 'en_US'), + 'verify_token' => env('WHATSAPP_VERIFY_TOKEN'), + 'app_secret' => env('WHATSAPP_APP_SECRET'), +]; diff --git a/database/migrations/2026_09_13_100000_create_kadar_rebet_table.php b/database/migrations/2026_09_13_100000_create_kadar_rebet_table.php new file mode 100644 index 0000000..53289c4 --- /dev/null +++ b/database/migrations/2026_09_13_100000_create_kadar_rebet_table.php @@ -0,0 +1,31 @@ +hasTable('kadar_rebet')) { + return; + } + + Schema::connection('mysql7')->create('kadar_rebet', function (Blueprint $table) { + $table->increments('id'); + $table->decimal('pembiayaan_min', 12, 2)->default(0); + $table->decimal('pembiayaan_max', 12, 2)->default(0); + $table->decimal('kadarrebet', 8, 4)->default(0); + }); + } + + public function down() + { + Schema::connection('mysql7')->dropIfExists('kadar_rebet'); + } +} diff --git a/database/migrations/2026_09_13_100001_add_annur_diskaun_columns.php b/database/migrations/2026_09_13_100001_add_annur_diskaun_columns.php new file mode 100644 index 0000000..6cf52d3 --- /dev/null +++ b/database/migrations/2026_09_13_100001_add_annur_diskaun_columns.php @@ -0,0 +1,102 @@ +getPdo(); + return true; + } catch (\Exception $e) { + return false; + } + }); + } + + public function up() + { + foreach ($this->getActiveDB() as $dbase) { + if (Schema::connection($dbase)->hasTable('gadai')) { + $addKadar = !Schema::connection($dbase)->hasColumn('gadai', 'kadarrebet'); + $addDiskaun = !Schema::connection($dbase)->hasColumn('gadai', 'diskaun'); + if ($addKadar || $addDiskaun) { + Schema::connection($dbase)->table('gadai', function (Blueprint $table) use ($addKadar, $addDiskaun) { + if ($addKadar) { + $table->decimal('kadarrebet', 8, 4)->nullable()->default(0); + } + if ($addDiskaun) { + $table->decimal('diskaun', 12, 2)->nullable()->default(0); + } + }); + } + } + + if ( + Schema::connection($dbase)->hasTable('tebus') + && !Schema::connection($dbase)->hasColumn('tebus', 'diskaun_rebate') + ) { + Schema::connection($dbase)->table('tebus', function (Blueprint $table) { + $table->decimal('diskaun_rebate', 12, 2)->nullable()->default(0); + }); + } + } + + if ( + Schema::connection('mysql7')->hasTable('transaksi_keuntungan') + && !Schema::connection('mysql7')->hasColumn('transaksi_keuntungan', 'kadardiskaun') + ) { + Schema::connection('mysql7')->table('transaksi_keuntungan', function (Blueprint $table) { + $table->decimal('kadardiskaun', 12, 2)->nullable()->default(0); + }); + } + } + + public function down() + { + foreach ($this->getActiveDB() as $dbase) { + if (Schema::connection($dbase)->hasTable('gadai')) { + Schema::connection($dbase)->table('gadai', function (Blueprint $table) use ($dbase) { + $drops = []; + if (Schema::connection($dbase)->hasColumn('gadai', 'kadarrebet')) { + $drops[] = 'kadarrebet'; + } + if (Schema::connection($dbase)->hasColumn('gadai', 'diskaun')) { + $drops[] = 'diskaun'; + } + if ($drops) { + $table->dropColumn($drops); + } + }); + } + + if ( + Schema::connection($dbase)->hasTable('tebus') + && Schema::connection($dbase)->hasColumn('tebus', 'diskaun_rebate') + ) { + Schema::connection($dbase)->table('tebus', function (Blueprint $table) { + $table->dropColumn('diskaun_rebate'); + }); + } + } + + if ( + Schema::connection('mysql7')->hasTable('transaksi_keuntungan') + && Schema::connection('mysql7')->hasColumn('transaksi_keuntungan', 'kadardiskaun') + ) { + Schema::connection('mysql7')->table('transaksi_keuntungan', function (Blueprint $table) { + $table->dropColumn('kadardiskaun'); + }); + } + } +} diff --git a/database/migrations/2026_09_17_100000_add_pc_verified_to_pembiayaan_online_table.php b/database/migrations/2026_09_17_100000_add_pc_verified_to_pembiayaan_online_table.php new file mode 100644 index 0000000..b98f47c --- /dev/null +++ b/database/migrations/2026_09_17_100000_add_pc_verified_to_pembiayaan_online_table.php @@ -0,0 +1,74 @@ +getPdo(); + + return true; + } catch (\Exception $e) { + return false; + } + } + ); + } + + public function up() + { + foreach ($this->getActiveDB() as $dbase) { + if (!Schema::connection($dbase)->hasTable('pembiayaan_online')) { + continue; + } + + Schema::connection($dbase)->table('pembiayaan_online', function (Blueprint $table) use ($dbase) { + if (!Schema::connection($dbase)->hasColumn('pembiayaan_online', 'pc_verified_by')) { + $table->string('pc_verified_by', 100) + ->nullable() + ->after('pc_submitted_by'); + } + + if (!Schema::connection($dbase)->hasColumn('pembiayaan_online', 'pc_verified_at')) { + $table->timestamp('pc_verified_at') + ->nullable() + ->after('pc_verified_by'); + } + }); + } + } + + public function down() + { + foreach ($this->getActiveDB() as $dbase) { + if (!Schema::connection($dbase)->hasTable('pembiayaan_online')) { + continue; + } + + Schema::connection($dbase)->table('pembiayaan_online', function (Blueprint $table) use ($dbase) { + $cols = []; + if (Schema::connection($dbase)->hasColumn('pembiayaan_online', 'pc_verified_at')) { + $cols[] = 'pc_verified_at'; + } + if (Schema::connection($dbase)->hasColumn('pembiayaan_online', 'pc_verified_by')) { + $cols[] = 'pc_verified_by'; + } + if (!empty($cols)) { + $table->dropColumn($cols); + } + }); + } + } +} diff --git a/docker-compose.yml b/docker-compose.yml index 2cab859..739b8bd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,6 +5,8 @@ services: dockerfile: docker/php/Dockerfile target: development working_dir: /var/www/html + ports: + - "8080:8000" volumes: - ./:/var/www/html:cached environment: @@ -12,16 +14,7 @@ services: APP_DEBUG: "true" depends_on: - mysql - - web: - image: nginx:1.25-alpine - ports: - - "8080:80" - volumes: - - ./:/var/www/html:cached - - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro - depends_on: - - app + command: ["php", "-S", "0.0.0.0:8000", "-t", "public"] mysql: image: mysql:8.0 diff --git a/env test b/env test deleted file mode 100644 index 0f7e749..0000000 --- a/env test +++ /dev/null @@ -1,257 +0,0 @@ - APP_NAME=Lumen -APP_ENV=local -APP_KEY=WbPGkYNmXZ6ZQplGlvl0iZ7zyW1b09xa -APP_DEBUG=true -APP_URL=http://api-arrahn.test -APP_TIMEZONE=Asia/Kuala_Lumpur - -LOG_CHANNEL=stack -LOG_SLACK_WEBHOOK_URL= - -DB_CONNECTION_36=mysql -DB_HOST_36=127.0.0.1 -DB_PORT_36=3306 -DB_DATABASE_36=arrahn_kb2 -DB_USERNAME_36=root -DB_PASSWORD_36= - -DB_CONNECTION_2=mysql -DB_HOST_2=127.0.0.1 -DB_PORT_2=3306 -DB_DATABASE_2=arrahn_wcy -DB_USERNAME_2=root -DB_PASSWORD_2= - -DB_CONNECTION_3=mysql -DB_HOST_3=127.0.0.1 -DB_PORT_3=3306 -DB_DATABASE_3=arrahn_1stop -DB_USERNAME_3=root -DB_PASSWORD_3= - -DB_CONNECTION_4=mysql -DB_HOST_4=127.0.0.1 -DB_PORT_4=3306 -DB_DATABASE_4=arrahn_jlwt -DB_USERNAME_4=root -DB_PASSWORD_4= - -DB_CONNECTION_5=mysql -DB_HOST_5=127.0.0.1 -DB_PORT_5=3306 -DB_DATABASE_5=arrahn_wb -DB_USERNAME_5=root -DB_PASSWORD_5= - -DB_CONNECTION_6=mysql -DB_HOST_6=127.0.0.1 -DB_PORT_6=3306 -DB_DATABASE_6=arrahn_kls -DB_USERNAME_6=root -DB_PASSWORD_6= - -DB_CONNECTION_7=mysql -DB_HOST_7=127.0.0.1 -DB_PORT_7=3306 -DB_DATABASE_7=online_arrahn -DB_USERNAME_7=root -DB_PASSWORD_7= - -DB_CONNECTION_8=mysql -DB_HOST_8=127.0.0.1 -DB_PORT_8=3306 -DB_DATABASE_8=arrahn_pp -DB_USERNAME_8=root -DB_PASSWORD_8= - -DB_CONNECTION_9=mysql -DB_HOST_9=127.0.0.1 -DB_PORT_9=3306 -DB_DATABASE_9=arrahn_mace -DB_USERNAME_9=root -DB_PASSWORD_9= - -DB_CONNECTION_10=mysql -DB_HOST_10=127.0.0.1 -DB_PORT_10=3306 -DB_DATABASE_10=arrahn_pm $ -DB_USERNAME_10=root -DB_PASSWORD_10= - -DB_CONNECTION_11=mysql -DB_HOST_11=127.0.0.1 -DB_PORT_11=3306 -DB_DATABASE_11=arrahn_gm -DB_USERNAME_11=root -DB_PASSWORD_11= - -DB_CONNECTION_12=mysql -DB_HOST_12=127.0.0.1 -DB_PORT_12=3306 -DB_DATABASE_12=arrahn_gcl -DB_USERNAME_12=root -DB_PASSWORD_12= - -DB_CONNECTION_13=mysql -DB_HOST_13=127.0.0.1 -DB_PORT_13=3306 -DB_DATABASE_13=arrahn_jli -DB_USERNAME_13=root -DB_PASSWORD_13= - -DB_CONNECTION_14=mysql -DB_HOST_14=127.0.0.1 -DB_PORT_14=3306 -DB_DATABASE_14=arrahn_rp -DB_USERNAME_14=root -DB_PASSWORD_14= - -DB_CONNECTION_15=mysql -DB_HOST_15=127.0.0.1 -DB_PORT_15=3306 -DB_DATABASE_15=arrahn_ktn -DB_USERNAME_15=root -DB_PASSWORD_15= - -DB_CONNECTION_16=mysql -DB_HOST_16=127.0.0.1 -DB_PORT_16=3306 -DB_DATABASE_16=arrahn_pg -DB_USERNAME_16=root -DB_PASSWORD_16= - -DB_CONNECTION_17=mysql -DB_HOST_17=127.0.0.1 -DB_PORT_17=3306 -DB_DATABASE_17=arrahn_skudai -DB_USERNAME_17=root -DB_PASSWORD_17= - -DB_CONNECTION_18=mysql -DB_HOST_18=127.0.0.1 -DB_PORT_18=3306 -DB_DATABASE_18=arrahn_pttn -DB_USERNAME_18=root -DB_PASSWORD_18= - -DB_CONNECTION_19=mysql -DB_HOST_19=127.0.0.1 -DB_PORT_19=3306 -DB_DATABASE_19=arrahn_btg -DB_USERNAME_19=root -DB_PASSWORD_19= - -DB_CONNECTION_20=mysql -DB_HOST_20=127.0.0.1 -DB_PORT_20=3306 -DB_DATABASE_20=arrahn_raub -DB_USERNAME_20=root -DB_PASSWORD_20= - -DB_CONNECTION_21=mysql -DB_HOST_21=127.0.0.1 -DB_PORT_21=3306 -DB_DATABASE_21=arrahn_kgr -DB_USERNAME_21=root -DB_PASSWORD_21= - -DB_CONNECTION_22=mysql -DB_HOST_22=127.0.0.1 -DB_PORT_22=3306 -DB_DATABASE_22=arrahn_sdk -DB_USERNAME_22=root -DB_PASSWORD_22= - -DB_CONNECTION_23=mysql -DB_HOST_23=127.0.0.1 -DB_PORT_23=3306 -DB_DATABASE_23=arrahn_sp -DB_USERNAME_23=root -DB_PASSWORD_23= - -DB_CONNECTION_24=mysql -DB_HOST_24=127.0.0.1 -DB_PORT_24=3306 -DB_DATABASE_24=arrahn_twu -DB_USERNAME_24=root -DB_PASSWORD_24= - -DB_CONNECTION_25=mysql -DB_HOST_25=127.0.0.1 -DB_PORT_25=3306 -DB_DATABASE_25=arrahn_api2 -DB_USERNAME_25=root -DB_PASSWORD_25= - -DB_CONNECTION_26=mysql -DB_HOST_26=127.0.0.1 -DB_PORT_26=3306 -DB_DATABASE_26=arrahn_kjg -DB_USERNAME_26=root -DB_PASSWORD_26= - -DB_CONNECTION_27=mysql -DB_HOST_27=127.0.0.1 -DB_PORT_27=3306 -DB_DATABASE_27=arrahn_rl -DB_USERNAME_27=root -DB_PASSWORD_27= - -DB_CONNECTION_28=mysql -DB_HOST_28=127.0.0.1 -DB_PORT_28=3306 -DB_DATABASE_28=arrahn_bfort -DB_USERNAME_28=root -DB_PASSWORD_28= - -DB_CONNECTION_29=mysql -DB_HOST_29=127.0.0.1 -DB_PORT_29=3306 -DB_DATABASE_29=arrahn_kbelud -DB_USERNAME_29=root -DB_PASSWORD_29= - -DB_CONNECTION_30=mysql -DB_HOST_30=127.0.0.1 -DB_PORT_30=3306 -DB_DATABASE_30=arrahn_tuaran -DB_USERNAME_30=root -DB_PASSWORD_30= - -DB_CONNECTION_31=mysql -DB_HOST_31=127.0.0.1 -DB_PORT_31=3306 -DB_DATABASE_31=arrahn_kngau -DB_USERNAME_31=root -DB_PASSWORD_31= - -DB_CONNECTION_32=mysql -DB_HOST_32=127.0.0.1 -DB_PORT_32=3306 -DB_DATABASE_32=arrahn_tm -DB_USERNAME_32=root -DB_PASSWORD_32= - -DB_CONNECTION_33=mysql -DB_HOST_33=127.0.0.1 -DB_PORT_33=3306 -DB_DATABASE_33=arrahn_tmlh -DB_USERNAME_33=root -DB_PASSWORD_33= - -DB_CONNECTION_34=mysql -DB_HOST_34=127.0.0.1 -DB_PORT_34=3306 -DB_DATABASE_34=arrahn_semporna -DB_USERNAME_34=root -DB_PASSWORD_34= - -DB_CONNECTION_35=mysql -DB_HOST_35=127.0.0.1 -DB_PORT_35=3306 -DB_DATABASE_35=arrahn_kb1 -DB_USERNAME_35=root -DB_PASSWORD_35= - -CACHE_DRIVER=file -QUEUE_CONNECTION=sync diff --git a/env.docker.example/base.env b/env.docker.example/base.env deleted file mode 100644 index 223e054..0000000 --- a/env.docker.example/base.env +++ /dev/null @@ -1,286 +0,0 @@ -APP_NAME=Lumen -APP_ENV=localhost -APP_KEY=WbPGkYNmXZ6ZQplGlvl0iZ7zyW1b09xa -APP_DEBUG=true -APP_URL=http://apiujrah.arrahn -APP_TIMEZONE=Asia/Kuala_Lumpur - - -LOG_CHANNEL=stack -LOG_SLACK_WEBHOOK_URL= - -#tukar 12-09-23 -#DB_CONNECTION=mysql -#DB_HOST=127.0.0.1 -#DB_PORT=3306 -#DB_DATABASE=arrahn_kb2 -#DB_USERNAME=root -#DB_PASSWORD=secret - -DB_CONNECTION_36=mysql -DB_HOST_36=database_zone1 -DB_PORT_36=3306 -DB_DATABASE_36=arrahn_kb2 -DB_USERNAME_36=root -DB_PASSWORD_36=secret - -DB_CONNECTION_2=mysql -DB_HOST_2=database_zone1 -DB_PORT_2=3306 -DB_DATABASE_2=arrahn_wcy -DB_USERNAME_2=root -DB_PASSWORD_2=secret - -DB_CONNECTION_3=mysql -DB_HOST_3=database_zone1 -DB_PORT_3=3306 -DB_DATABASE_3=arrahn_1stop -DB_USERNAME_3=root -DB_PASSWORD_3=secret - -DB_CONNECTION_4=mysql -DB_HOST_4=database_zone1 -DB_PORT_4=3306 -DB_DATABASE_4=arrahn_jlwt -DB_USERNAME_4=root -DB_PASSWORD_4=secret - -DB_CONNECTION_5=mysql -DB_HOST_5=database_zone1 -DB_PORT_5=3306 -DB_DATABASE_5=arrahn_wb -DB_USERNAME_5=root -DB_PASSWORD_5=secret - -DB_CONNECTION_6=mysql -DB_HOST_6=database_zone1 -DB_PORT_6=3306 -DB_DATABASE_6=arrahn_kls -DB_USERNAME_6=root -DB_PASSWORD_6=secret - -DB_CONNECTION_7=mysql -DB_HOST_7=database_zone1 -DB_PORT_7=3306 -DB_DATABASE_7=online_arrahn -DB_USERNAME_7=root -DB_PASSWORD_7=secret - -DB_CONNECTION_8=mysql -DB_HOST_8=database_zone1 -DB_PORT_8=3306 -DB_DATABASE_8=arrahn_pp -DB_USERNAME_8=root -DB_PASSWORD_8=secret - -DB_CONNECTION_9=mysql -DB_HOST_9=database_zone1 -DB_PORT_9=3306 -DB_DATABASE_9=arrahn_mace -DB_USERNAME_9=root -DB_PASSWORD_9=secret - -DB_CONNECTION_10=mysql -DB_HOST_10=database_zone1 -DB_PORT_10=3306 -DB_DATABASE_10=arrahn_pm -DB_USERNAME_10=root -DB_PASSWORD_10=secret - -DB_CONNECTION_11=mysql -DB_HOST_11=database_zone1 -DB_PORT_11=3306 -DB_DATABASE_11=arrahn_gm -DB_USERNAME_11=root -DB_PASSWORD_11=secret - -DB_CONNECTION_12=mysql -DB_HOST_12=database_zone1 -DB_PORT_12=3306 -DB_DATABASE_12=arrahn_gcl -DB_USERNAME_12=root -DB_PASSWORD_12=secret - -DB_CONNECTION_13=mysql -DB_HOST_13=database_zone1 -DB_PORT_13=3306 -DB_DATABASE_13=arrahn_jli -DB_USERNAME_13=root -DB_PASSWORD_13=secret - -DB_CONNECTION_14=mysql -DB_HOST_14=database_zone1 -DB_PORT_14=3306 -DB_DATABASE_14=arrahn_rp -DB_USERNAME_14=root -DB_PASSWORD_14=secret - -DB_CONNECTION_15=mysql -DB_HOST_15=database_zone2 -DB_PORT_15=3306 -DB_DATABASE_15=arrahn_ktn -DB_USERNAME_15=root -DB_PASSWORD_15=secret - -DB_CONNECTION_16=mysql -DB_HOST_16=database_zone2 -DB_PORT_16=3306 -DB_DATABASE_16=arrahn_pg -DB_USERNAME_16=root -DB_PASSWORD_16=secret - -DB_CONNECTION_17=mysql -DB_HOST_17=database_zone2 -DB_PORT_17=3306 -DB_DATABASE_17=arrahn_skudai -DB_USERNAME_17=root -DB_PASSWORD_17=secret - -DB_CONNECTION_18=mysql -DB_HOST_18=database_zone2 -DB_PORT_18=3306 -DB_DATABASE_18=arrahn_pttn -DB_USERNAME_18=root -DB_PASSWORD_18=secret - -DB_CONNECTION_19=mysql -DB_HOST_19=database_zone2 -DB_PORT_19=3306 -DB_DATABASE_19=arrahn_btg -DB_USERNAME_19=root -DB_PASSWORD_19=secret - -DB_CONNECTION_20=mysql -DB_HOST_20=database_zone2 -DB_PORT_20=3306 -DB_DATABASE_20=arrahn_raub -DB_USERNAME_20=root -DB_PASSWORD_20=secret - -DB_CONNECTION_21=mysql -DB_HOST_21=database_zone2 -DB_PORT_21=3306 -DB_DATABASE_21=arrahn_kgr -DB_USERNAME_21=root -DB_PASSWORD_21=secret - -DB_CONNECTION_22=mysql -DB_HOST_22=database_zone2 -DB_PORT_22=3306 -DB_DATABASE_22=arrahn_sdk -DB_USERNAME_22=root -DB_PASSWORD_22=secret - -DB_CONNECTION_23=mysql -DB_HOST_23=database_zone2 -DB_PORT_23=3306 -DB_DATABASE_23=arrahn_sp -DB_USERNAME_23=root -DB_PASSWORD_23=secret - -DB_CONNECTION_24=mysql -DB_HOST_24=database_zone2 -DB_PORT_24=3306 -DB_DATABASE_24=arrahn_twu -DB_USERNAME_24=root -DB_PASSWORD_24=secret - -DB_CONNECTION_25=mysql -DB_HOST_25=database_zone2 -DB_PORT_25=3306 -DB_DATABASE_25=arrahn_api2 -DB_USERNAME_25=root -DB_PASSWORD_25=secret - -DB_CONNECTION_26=mysql -DB_HOST_26=database_zone2 -DB_PORT_26=3306 -DB_DATABASE_26=arrahn_kjg -DB_USERNAME_26=root -DB_PASSWORD_26=secret - -DB_CONNECTION_27=mysql -DB_HOST_27=database_zone2 -DB_PORT_27=3306 -DB_DATABASE_27=arrahn_rl -DB_USERNAME_27=root -DB_PASSWORD_27=secret - -DB_CONNECTION_28=mysql -DB_HOST_28=database_zone2 -DB_PORT_28=3306 -DB_DATABASE_28=arrahn_bfort -DB_USERNAME_28=root -DB_PASSWORD_28=secret - -DB_CONNECTION_29=mysql -DB_HOST_29=database_zone2 -DB_PORT_29=3306 -DB_DATABASE_29=arrahn_kbelud -DB_USERNAME_29=root -DB_PASSWORD_29=secret - -DB_CONNECTION_30=mysql -DB_HOST_30=database_zone2 -DB_PORT_30=3306 -DB_DATABASE_30=arrahn_tuaran -DB_USERNAME_30=root -DB_PASSWORD_30=secret - -DB_CONNECTION_31=mysql -DB_HOST_31=database_zone2 -DB_PORT_31=3306 -DB_DATABASE_31=arrahn_kngau -DB_USERNAME_31=root -DB_PASSWORD_31=secret - -DB_CONNECTION_32=mysql -DB_HOST_32=database_zone1 -DB_PORT_32=3306 -DB_DATABASE_32=arrahn_tm -DB_USERNAME_32=root -DB_PASSWORD_32=secret - -DB_CONNECTION_33=mysql -DB_HOST_33=database_zone2 -DB_PORT_33=3306 -DB_DATABASE_33=arrahn_tmlh -DB_USERNAME_33=root -DB_PASSWORD_33=secret - - -DB_CONNECTION_34=mysql -DB_HOST_34=database_zone2 -DB_PORT_34=3306 -DB_DATABASE_34=arrahn_semporna -DB_USERNAME_34=root -DB_PASSWORD_34=secret - -DB_CONNECTION_35=mysql -DB_HOST_35=database_zone1 -DB_PORT_35=3306 -DB_DATABASE_35=arrahn_kb1 -DB_USERNAME_35=root -DB_PASSWORD_35=secret - -#DB_CONNECTION_37=mysql -#DB_HOST_37=database_zone2 -#DB_PORT_37=3306 -#DB_DATABASE_37=arrahn_ld -#DB_USERNAME_37=root -#DB_PASSWORD_37=secret - -DB_CONNECTION_38=mysql -DB_HOST_38=database_zone2 -DB_PORT_38=3306 -DB_DATABASE_38=arrahn_pttn2 -DB_USERNAME_38=root -DB_PASSWORD_38=secret - -CACHE_DRIVER=file -QUEUE_CONNECTION=database - -WABOT_API=https://app.wabot.my/api/send.php -WABOT_INSTANCES_ID=67B69A20D329B -WABOT_TOKEN_KEYS=66a08339284bc -ACTIVE_JOB_SERVER=true diff --git a/env.docker.example/kgmk.env b/env.docker.example/kgmk.env deleted file mode 100644 index 2299054..0000000 --- a/env.docker.example/kgmk.env +++ /dev/null @@ -1,54 +0,0 @@ -APP_NAME=Lumen -APP_ENV=localhost -APP_KEY=WbPGkYNmXZ6ZQplGlvl0iZ7zyW1b09xa -APP_DEBUG=true -APP_URL=http://apiujrah.arrahn -APP_TIMEZONE=Asia/Kuala_Lumpur - - -LOG_CHANNEL=stack -LOG_SLACK_WEBHOOK_URL= - -#tukar 12-09-23 -#DB_CONNECTION=mysql -#DB_HOST=127.0.0.1 -#DB_PORT=3306 -#DB_DATABASE=arrahn_kb2 -#DB_USERNAME=root -#DB_PASSWORD=secret - -DB_CONNECTION_2=mysql -DB_HOST_2=database_zone_franchise -DB_PORT_2=3306 -DB_DATABASE_2=kguru_kb -DB_USERNAME_2=root -DB_PASSWORD_2=secret - -DB_CONNECTION_3=mysql -DB_HOST_3=database_zone_franchise -DB_PORT_3=3306 -DB_DATABASE_3=Kguru_melor -DB_USERNAME_3=root -DB_PASSWORD_3=secret - -DB_CONNECTION_4=mysql -DB_HOST_4=database_zone_franchise -DB_PORT_4=3306 -DB_DATABASE_4=kguru_tumpat -DB_USERNAME_4=root -DB_PASSWORD_4=secret - -DB_CONNECTION_7=mysql -DB_HOST_7=database_zone_franchise -DB_PORT_7=3306 -DB_DATABASE_7=master_koopguru -DB_USERNAME_7=root -DB_PASSWORD_7=secret - -CACHE_DRIVER=file -QUEUE_CONNECTION=database - -WABOT_API=https://app.wabot.my/api/send.php -WABOT_INSTANCES_ID=67B69A20D329B -WABOT_TOKEN_KEYS=66a08339284bc -ACTIVE_JOB_SERVER=true diff --git a/env.docker.example/krk.env b/env.docker.example/krk.env deleted file mode 100644 index 6b6e83e..0000000 --- a/env.docker.example/krk.env +++ /dev/null @@ -1,54 +0,0 @@ -APP_NAME=Lumen -APP_ENV=localhost -APP_KEY=WbPGkYNmXZ6ZQplGlvl0iZ7zyW1b09xa -APP_DEBUG=true -APP_URL=http://apiujrah.arrahn -APP_TIMEZONE=Asia/Kuala_Lumpur - - -LOG_CHANNEL=stack -LOG_SLACK_WEBHOOK_URL= - -#tukar 12-09-23 -#DB_CONNECTION=mysql -#DB_HOST=127.0.0.1 -#DB_PORT=3306 -#DB_DATABASE=arrahn_kb2 -#DB_USERNAME=root -#DB_PASSWORD=secret - -DB_CONNECTION_3=mysql -DB_HOST_3=database-zone-franchise -DB_PORT_3=3306 -DB_DATABASE_3=krk_losong -DB_USERNAME_3=root -DB_PASSWORD_3=secret - -DB_CONNECTION_4=mysql -DB_HOST_4=database-zone-franchise -DB_PORT_4=3306 -DB_DATABASE_4=krk_kemaman -DB_USERNAME_4=root -DB_PASSWORD_4=secret - -DB_CONNECTION_5=mysql -DB_HOST_5=database-zone-franchise -DB_PORT_5=3306 -DB_DATABASE_5=krk_tokbali -DB_USERNAME_5=root -DB_PASSWORD_5=secret - -DB_CONNECTION_7=mysql -DB_HOST_7=database-zone-franchise -DB_PORT_7=3306 -DB_DATABASE_7=master_krk -DB_USERNAME_7=root -DB_PASSWORD_7=secret - -CACHE_DRIVER=file -QUEUE_CONNECTION=database - -WABOT_API=https://app.wabot.my/api/send.php -WABOT_INSTANCES_ID=67B69A20D329B -WABOT_TOKEN_KEYS=66a08339284bc -ACTIVE_JOB_SERVER=true diff --git a/routes/web.php b/routes/web.php index 2dd6886..1fba531 100644 --- a/routes/web.php +++ b/routes/web.php @@ -25,7 +25,10 @@ $router->get('/health', function () { return response()->json(['status' => 'ok']); }); -$router->group(['namespace' => '\Rap2hpoutre\LaravelLogViewer'], function() use ($router) { +$router->group([ + 'namespace' => '\Rap2hpoutre\LaravelLogViewer', + 'middleware' => 'logviewer.password', +], function () use ($router) { $router->get('logs', 'LogViewerController@index'); }); @@ -583,6 +586,8 @@ $router->group(['prefix'=>'api'], function () use ($router){ $router->get('CalculationPendahuluanSerahan/{kodcaw}',['uses'=>'VaultController@CalculationPendahuluanSerahan']); $router->get('KeuntunganArRahn/{kodcaw}',['uses'=>'GadaiController@CalculationKeuntungan']); $router->get('RebetCalculation/{kodcaw}',['uses'=>'TebusController@RebetCalculation']); + $router->get('RebetPromoCalculation/{kodcaw}',['uses'=>'TebusController@RebetPromoCalculation']); + $router->get('PelarasanRebate/{kodcaw}',['uses'=>'TebusController@PelarasanRebate']); //-- Harta Semasa --// $router->get('PinjamanDiberi/{kodcaw}',['uses'=>'GadaiController@CalculationPinjamanDiberi']); @@ -610,8 +615,10 @@ $router->group(['prefix'=>'api'], function () use ($router){ //Dua-Dua Table $router->get('PendahuluanSerahanLejer/{kodcaw}',['uses'=>'VaultController@CalculationPendahuluanSerahanLejer']); + $router->get('ModalOnlineLejer/{kodcaw}', ['uses' => 'VaultController@CalculationModalOnlineLejer']); $router->get('KeuntunganArRahnLejer/{kodcaw}',['uses'=>'GadaiController@CalculationKeuntunganLejer']); $router->get('RebetCalculationLejer/{kodcaw}',['uses'=>'TebusController@RebetCalculationLejer']); + $router->get('RebetPromoCalculationLejer/{kodcaw}',['uses'=>'TebusController@RebetPromoCalculationLejer']); $router->get('cajlelongLejer/{kodcaw}',['uses'=>'LelongController@cajlelongcalculationLejer']); // //-- Harta Semasa --// @@ -698,6 +705,9 @@ $router->group(['prefix'=>'api'], function () use ($router){ $router->get('initiate/modal-online', ['uses' => 'ModalOnlineController@initiate']); // Operasi kelulusan pembiayaan online (must be before {kodcaw} routes) + $router->get('whatsapp/webhook', ['uses' => 'WhatsappWebhookController@verify']); + $router->post('whatsapp/webhook', ['uses' => 'WhatsappWebhookController@handle']); + $router->get('pembiayaan-online/operasi/batches', ['uses' => 'PembiayaanOnlineController@operasiListBatches']); $router->get('pembiayaan-online/operasi/{kodcaw}/batches/{batchId}', ['uses' => 'PembiayaanOnlineController@operasiShowBatch']); $router->post('pembiayaan-online/operasi/{kodcaw}/lines/{id}/approve', ['uses' => 'PembiayaanOnlineController@operasiApproveLine']); @@ -712,7 +722,11 @@ $router->group(['prefix'=>'api'], function () use ($router){ $router->get('pembiayaan-online/{kodcaw}/paid', ['uses' => 'PembiayaanOnlineController@paidQueue']); $router->post('pembiayaan-online/{kodcaw}/paid/blast', ['uses' => 'PembiayaanOnlineController@markBlastSent']); $router->put('pembiayaan-online/{kodcaw}/lines/{id}', ['uses' => 'PembiayaanOnlineController@updateLine']); + $router->post('pembiayaan-online/{kodcaw}/lines/{id}/verify', ['uses' => 'PembiayaanOnlineController@verifyLine']); + $router->post('pembiayaan-online/{kodcaw}/lines/{id}/unverify', ['uses' => 'PembiayaanOnlineController@unverifyLine']); $router->get('pembiayaan-online/{kodcaw}/lines/{id}/bukti', ['uses' => 'PembiayaanOnlineController@getBukti']); + $router->get('pembiayaan-online/{kodcaw}/lines/{id}/bukti-akaun', ['uses' => 'PembiayaanOnlineController@getBuktiAkaun']); + $router->get('pembiayaan-online/{kodcaw}/lines/{id}', ['uses' => 'PembiayaanOnlineController@showLine']); $router->get('pembiayaan-online/{kodcaw}/batches', ['uses' => 'PembiayaanOnlineController@listBatches']); $router->get('pembiayaan-online/{kodcaw}/batches/{batchId}', ['uses' => 'PembiayaanOnlineController@showBatch']); $router->post('pembiayaan-online/{kodcaw}/batches/submit', ['uses' => 'PembiayaanOnlineController@submitBatch']);