Kaynağa Gözat

wesmiler 抢表商城

APPLE 3 yıl önce
ebeveyn
işleme
d6c8bdd30f

+ 166 - 0
addons/admin/src/views/system/scoregoods/cates.vue

@@ -0,0 +1,166 @@
+<template>
+  <div class="ele-body">
+    <el-card shadow="never">
+      <!-- 搜索表单 -->
+      <el-form :model="table.where" label-width="90px" class="ele-form-search"
+               @keyup.enter.native="$refs.table.reload()" @submit.native.prevent>
+        <el-row :gutter="15">
+          <el-col :md="8" :sm="12">
+            <el-form-item label="分类名称:">
+              <el-input v-model="table.where.keyword" placeholder="请输入分类名称" clearable/>
+            </el-form-item>
+          </el-col>
+          <el-col :md="6" :sm="12">
+            <div class="ele-form-actions">
+              <el-button type="primary" @click="$refs.table.reload()" icon="el-icon-search" class="ele-btn-icon">查询
+              </el-button>
+              <el-button @click="(table.where={})&&$refs.table.reload()">重置</el-button>
+            </div>
+          </el-col>
+        </el-row>
+      </el-form>
+      <!-- 操作按钮 -->
+      <div class="ele-table-tool ele-table-tool-default">
+        <el-button @click="showEdit=true" type="primary" icon="el-icon-plus" class="ele-btn-icon" size="small" v-if="permission.includes('sys:cates:add')">添加
+        </el-button>
+        <el-button @click="remove()" type="danger" icon="el-icon-delete" class="ele-btn-icon" size="small" v-if="permission.includes('sys:cates:dall')">批量删除
+        </el-button>
+      </div>
+      <!-- 数据表格 -->
+      <ele-data-table ref="table" :config="table" :choose.sync="choose" height="calc(100vh - 315px)" highlight-current-row>
+        <template slot-scope="{index}">
+          <el-table-column type="selection" width="45" align="center" fixed="left"/>
+          <el-table-column type="index" :index="index" label="编号" width="60" align="center" fixed="left" show-overflow-tooltip/>
+          <el-table-column prop="name" label="分类名称" sortable="custom" show-overflow-tooltip min-width="200"/>
+          <el-table-column label="创建时间" sortable="custom" show-overflow-tooltip align="center" min-width="160">
+            <template slot-scope="{row}">{{ row.create_time }}</template>
+          </el-table-column>
+          <el-table-column label="操作" width="130px" align="center" :resizable="false"  fixed="right">
+            <template slot-scope="{row}">
+              <el-link @click="edit(row)" icon="el-icon-edit" type="primary" :underline="false" v-if="permission.includes('sys:cates:edit')">修改</el-link>
+              <el-popconfirm title="确定要删除此分类吗?" @confirm="remove(row)" class="ele-action">
+                <el-link slot="reference" icon="el-icon-delete" type="danger" :underline="false" v-if="permission.includes('sys:cates:delete')">删除</el-link>
+              </el-popconfirm>
+            </template>
+          </el-table-column>
+        </template>
+      </ele-data-table>
+    </el-card>
+    <!-- 编辑弹窗 -->
+    <el-dialog :title="editForm.id?'修改分类':'修改分类'" :visible.sync="showEdit" width="400px"
+               @closed="editForm={status:1}" :destroy-on-close="true" :lock-scroll="false">
+      <el-form :model="editForm" ref="editForm" :rules="editRules" label-width="100px">
+        <el-form-item label="分类名称:" prop="name">
+          <el-input v-model="editForm.name" placeholder="请输入分类名称" clearable/>
+        </el-form-item>
+        <el-form-item label="状态:" prop="status">
+          <el-select v-model="editForm.status" placeholder="请选择状态" class="ele-block" clearable>
+            <el-option label="正常" :value="1"/>
+            <el-option label="禁用" :value="2"/>
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div slot="footer">
+        <el-button @click="showEdit=false">取消</el-button>
+        <el-button type="primary" @click="save">保存</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from "vuex";
+export default {
+  name: "SysCates",
+  data() {
+    return {
+      table: {url: '/scoregoodscate/index', where: {}},  // 表格配置
+      choose: [],  // 表格选中数据
+      showEdit: false,  // 是否显示表单弹窗
+      editForm: {status:1},  // 表单数据
+      editRules: {  // 表单验证规则
+        name: [
+          {required: true, message: '请输入分类名称', trigger: 'blur'}
+        ],
+      },
+    }
+  },
+  computed: {
+    ...mapGetters(["permission"]),
+  },
+  mounted() {
+  },
+  methods: {
+    /* 显示编辑 */
+    edit(row) {
+      this.editForm = Object.assign({}, row);
+      this.showEdit = true;
+    },
+    /* 保存编辑 */
+    save() {
+      this.$refs['editForm'].validate((valid) => {
+        if (valid) {
+          const loading = this.$loading({lock: true});
+          this.$http.post('/scoregoodscate/edit', this.editForm).then(res => {
+            loading.close();
+            if (res.data.code === 0) {
+              this.showEdit = false;
+              this.$message({type: 'success', message: res.data.msg});
+              this.$refs.table.reload();
+            } else {
+              this.$message.error(res.data.msg);
+            }
+          }).catch(e => {
+            loading.close();
+            this.$message.error(e.message);
+          });
+        } else {
+          return false;
+        }
+      });
+    },
+    /* 删除 */
+    remove(row) {
+      if (!row) {  // 批量删除
+        if (this.choose.length === 0) return this.$message.error('请至少选择一条数据');
+        let ids = this.choose.map(d => d.id);
+        this.$confirm('确定要删除选中的分类吗?', '提示', {type: 'warning'}).then(() => {
+          const loading = this.$loading({lock: true});
+          this.$http.post('/scoregoodscate/delete', {id: ids}).then(res => {
+            loading.close();
+            if (res.data.code === 0) {
+              this.$message({type: 'success', message: res.data.msg});
+              this.$refs.table.reload();
+            } else {
+              this.$message.error(res.data.msg);
+            }
+          }).catch(e => {
+            loading.close();
+            this.$message.error(e.message);
+          });
+        }).catch(() => 0);
+      } else {  // 单个删除
+        const loading = this.$loading({lock: true});
+        this.$http.post('/scoregoodscate/delete', {id:row.id}).then(res => {
+          loading.close();
+          if (res.data.code === 0) {
+            this.$message({type: 'success', message: res.data.msg});
+            this.$refs.table.reload();
+          } else {
+            this.$message.error(res.data.msg);
+          }
+        }).catch(e => {
+          loading.close();
+          this.$message.error(e.message);
+        });
+      }
+    },
+  }
+}
+</script>
+
+<style scoped>
+.ele-block >>> .el-upload, .ele-block >>> .el-upload-dragger {
+  width: 100%;
+}
+</style>

+ 0 - 225
addons/admin/src/views/system/trade/index.vue

@@ -1,225 +0,0 @@
-<template>
-  <div class="ele-body">
-    <el-card shadow="never">
-      <!-- 搜索表单 -->
-      <el-form :model="table.where" label-width="100px" class="ele-form-search"
-               @keyup.enter.native="$refs.table.reload()" @submit.native.prevent>
-        <el-row :gutter="15">
-          <el-col :md="6" :sm="12">
-            <el-form-item label="用户账号:">
-              <el-input v-model="table.where.keyword" placeholder="请输入用户名/手机号" clearable/>
-            </el-form-item>
-          </el-col>
-          <el-col :md="4" :sm="12">
-            <el-form-item label="状态:">
-              <el-select v-model="table.where.status" placeholder="请选择" class="ele-fluid">
-                <el-option label="全部" value="0"/>
-                <el-option label="待支付" value="1"/>
-                <el-option label="已付款" value="2"/>
-                <el-option label="已确认" value="3"/>
-                <el-option label="已售出" value="4"/>
-                <el-option label="已取消" value="5"/>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :md="6" :sm="12">
-            <el-form-item label="起止日期:" prop="date">
-              <el-date-picker
-                  v-model="table.where.date"
-                  type="daterange"
-                  placeholder="选择起止日期"
-                  size="small"
-                  value-format="yyyy-MM-dd"
-                  format="yyyy-MM-dd">
-              </el-date-picker>
-            </el-form-item>
-          </el-col>
-
-          <el-col :md="4" :sm="12">
-            <div class="ele-form-actions">
-              <el-button type="primary" @click="$refs.table.reload()" icon="el-icon-search"
-                         class="ele-btn-icon">查询
-              </el-button>
-              <el-button @click="(table.where={status:'0'})&&$refs.table.reload()">重置</el-button>
-            </div>
-          </el-col>
-        </el-row>
-      </el-form>
-
-      <!-- 数据表格 -->
-      <ele-data-table ref="table" :config="table" :choose.sync="choose" height="calc(100vh - 315px)"
-                      highlight-current-row>
-        <template slot-scope="{index}">
-          <el-table-column type="selection" width="45" align="center" fixed="left"/>
-          <el-table-column prop="id" label="ID" width="60" align="center" fixed="left" show-overflow-tooltip/>
-          <el-table-column prop="shop_name" label="店铺" sortable="custom" show-overflow-tooltip min-width="120"/>
-          <el-table-column label="商品" min-width="100" align="center">
-            <template slot-scope="{row}">
-              <el-avatar shape="square" :size="25" :src="row.cover"/>
-              <span>{{row.goods_name}}(原价:{{row.source_price}})</span>
-            </template>
-          </el-table-column>
-          <el-table-column prop="sell_mobile" label="卖家用户" sortable="custom" show-overflow-tooltip min-width="120"/>
-          <el-table-column prop="nickname" label="购买用户" sortable="custom" show-overflow-tooltip min-width="150">
-            <template slot-scope="{row}">
-              <span>{{row.nickname}}({{row.mobile}})</span>
-            </template>
-          </el-table-column>
-<!--          <el-table-column prop="num" label="数量" sortable="custom" show-overflow-tooltip min-width="120"/>-->
-          <el-table-column prop="price" label="买入价格" sortable="custom" show-overflow-tooltip min-width="120"/>
-          <el-table-column prop="new_price" label="最新售价" sortable="custom" show-overflow-tooltip min-width="120"/>
-          <el-table-column prop="supplier_price" label="补价" sortable="custom" show-overflow-tooltip min-width="120"/>
-          <el-table-column prop="fee" label="上架费" sortable="custom" show-overflow-tooltip min-width="120"/>
-          <el-table-column prop="is_pay" label="已支付" sortable="custom" show-overflow-tooltip min-width="130">
-            <template slot-scope="{row}">
-              <a v-if="row.is_pay" class="ele-text-success">是</a>
-              <a v-else class="ele-text-danger">否</a>
-            </template>
-          </el-table-column>
-          <el-table-column prop="status" label="交易状态" sortable="custom" :resizable="false" min-width="120">
-            <template slot-scope="{row}">
-              <span v-if="row.status==1" class="ele-text-default">待支付</span>
-              <span v-else-if="row.status==2" class="ele-text-primary">已打款</span>
-              <span v-else-if="row.status==3" class="ele-text-success">已确认</span>
-              <span v-else-if="row.status==4" class="ele-text-warning">已售出</span>
-              <span v-else-if="row.status==5" class="ele-text-danger">已取消</span>
-            </template>
-          </el-table-column>
-          <el-table-column prop="is_sell" label="待售状态" sortable="custom" :resizable="false" min-width="120">
-            <template slot-scope="{row}">
-              <span v-if="row.is_sell==0" class="ele-text-default">待售中</span>
-              <span v-else-if="row.is_sell==1" class="ele-text-default">待店长确认</span>
-              <span v-else-if="row.is_sell==2" class="ele-text-primary">已确认待售</span>
-            </template>
-          </el-table-column>
-          <el-table-column label="购买时间" sortable="custom" show-overflow-tooltip align="center" min-width="160">
-            <template slot-scope="{row}">{{ row.create_time }}</template>
-          </el-table-column>
-          <el-table-column label="付款时间" sortable="custom" show-overflow-tooltip align="center" min-width="160">
-            <template slot-scope="{row}">{{ row.pay_time }}</template>
-          </el-table-column>
-          <el-table-column label="确认时间" sortable="custom" show-overflow-tooltip align="center" min-width="160">
-            <template slot-scope="{row}">{{ row.confirm_time }}</template>
-          </el-table-column>
-          <el-table-column prop="pay_img" label="付款凭证" sortable="custom" show-overflow-tooltip min-width="130">
-            <template slot-scope="{row}">
-              <el-image
-                  style="width: 80px; height: 80px"
-                  :src="row.pay_img"
-                  :preview-src-list="[row.pay_img]">
-              </el-image>
-            </template>
-          </el-table-column>
-          <el-table-column prop="remark" label="备注" sortable="custom" show-overflow-tooltip min-width="130"/>
-          <el-table-column label="操作" width="150px" align="center" :resizable="false"  fixed="right">
-            <template slot-scope="{row}">
-              <el-popconfirm title="确定要删除此交易订单吗?" @confirm="remove(row)" class="ele-action">
-                <el-link slot="reference" icon="el-icon-delete" type="danger" :underline="false" v-if="permission.includes('sys:trade:delete')">删除</el-link>
-              </el-popconfirm>
-            </template>
-          </el-table-column>
-        </template>
-      </ele-data-table>
-    </el-card>
-  </div>
-</template>
-
-<script>
-import {mapGetters} from "vuex";
-
-export default {
-  name: "SysTrade",
-  components: {},
-  data() {
-    return {
-      table: {url: '/trade/index', where: {status:'0'},page:{limit: 30}},  // 表格配置
-      choose: [],  // 表格选中数据
-    }
-  },
-  computed: {
-    ...mapGetters(["permission"]),
-
-  },
-  mounted() {
-  },
-  methods: {
-    handleClick() {
-
-    },
-    /* 删除 */
-    remove(row) {
-      this.$message.closeAll()
-      if (!row) {  // 批量删除
-        if (this.choose.length === 0) return this.$message.error('请至少选择一条数据');
-        let ids = this.choose.map(d => d.id);
-        this.$confirm('确定要删除选中的交易订单吗?', '提示', {type: 'warning'}).then(() => {
-          const loading = this.$loading({lock: true});
-          this.$http.post('/trade/delete', {id: ids}).then(res => {
-            loading.close();
-            if (res.data.code === 0) {
-              this.$message({type: 'success', message: res.data.msg});
-              this.$refs.table.reload();
-            } else {
-              this.$message.error(res.data.msg);
-            }
-          }).catch(e => {
-            loading.close();
-            this.$message.error(e.message);
-          });
-        }).catch(() => 0);
-      } else {  // 单个删除
-        const loading = this.$loading({lock: true});
-        this.$http.post('/account/delete', {id:row.id}).then(res => {
-          loading.close();
-          if (res.data.code === 0) {
-            this.$message({type: 'success', message: res.data.msg});
-            this.$refs.table.reload();
-          } else {
-            this.$message.error(res.data.msg);
-          }
-        }).catch(e => {
-          loading.close();
-          this.$message.error(e.message);
-        });
-      }
-    },
-  }
-}
-</script>
-
-<style scoped>
-.ele-block >>> .el-upload, .ele-block >>> .el-upload-dragger {
-  width: 100%;
-}
-
-.el-wallet {
-  margin: 15px 0px;
-  display: flex;
-  padding: 15px 0;
-  background-color: #f1f1f1;
-}
-.el-wallet .el-wallet-item {
-  min-width: 240px;
-  text-align: left;
-}
-.el-wallet .el-wallet-item .usdt {
-  vertical-align: middle;
-}
-
-.el-wallet .el-wallet-item .info {
-  display: inline-block;
-  vertical-align: middle;
-  margin-left: 4px;
-}
-.usdt {
-  width: 32px;
-  height: 32px;
-  border-radius: 50%;
-  vertical-align: middle;
-  margin-left: 4px;
-}
-
-.el-date-editor--daterange.el-input__inner {
-  width: auto;
-}
-</style>

+ 1 - 0
composer.json

@@ -13,6 +13,7 @@
         "fruitcake/laravel-cors": "^2.0",
         "gregwar/captcha": "^1.1",
         "guzzlehttp/guzzle": "^7.0.1",
+        "jaeger/querylist": "^4.2",
         "laravel/framework": "^8.12",
         "laravel/tinker": "^2.5",
         "maatwebsite/excel": "^3.1",

+ 98 - 0
vendor/composer/semver/README.md

@@ -0,0 +1,98 @@
+composer/semver
+===============
+
+Semver (Semantic Versioning) library that offers utilities, version constraint parsing and validation.
+
+Originally written as part of [composer/composer](https://github.com/composer/composer),
+now extracted and made available as a stand-alone library.
+
+[![Continuous Integration](https://github.com/composer/semver/workflows/Continuous%20Integration/badge.svg?branch=main)](https://github.com/composer/semver/actions)
+
+
+Installation
+------------
+
+Install the latest version with:
+
+```bash
+$ composer require composer/semver
+```
+
+
+Requirements
+------------
+
+* PHP 5.3.2 is required but using the latest version of PHP is highly recommended.
+
+
+Version Comparison
+------------------
+
+For details on how versions are compared, refer to the [Versions](https://getcomposer.org/doc/articles/versions.md)
+article in the documentation section of the [getcomposer.org](https://getcomposer.org) website.
+
+
+Basic usage
+-----------
+
+### Comparator
+
+The [`Composer\Semver\Comparator`](https://github.com/composer/semver/blob/main/src/Comparator.php) class provides the following methods for comparing versions:
+
+* greaterThan($v1, $v2)
+* greaterThanOrEqualTo($v1, $v2)
+* lessThan($v1, $v2)
+* lessThanOrEqualTo($v1, $v2)
+* equalTo($v1, $v2)
+* notEqualTo($v1, $v2)
+
+Each function takes two version strings as arguments and returns a boolean. For example:
+
+```php
+use Composer\Semver\Comparator;
+
+Comparator::greaterThan('1.25.0', '1.24.0'); // 1.25.0 > 1.24.0
+```
+
+### Semver
+
+The [`Composer\Semver\Semver`](https://github.com/composer/semver/blob/main/src/Semver.php) class provides the following methods:
+
+* satisfies($version, $constraints)
+* satisfiedBy(array $versions, $constraint)
+* sort($versions)
+* rsort($versions)
+
+### Intervals
+
+The [`Composer\Semver\Intervals`](https://github.com/composer/semver/blob/main/src/Intervals.php) static class provides
+a few utilities to work with complex constraints or read version intervals from a constraint:
+
+```php
+use Composer\Semver\Intervals;
+
+// Checks whether $candidate is a subset of $constraint
+Intervals::isSubsetOf(ConstraintInterface $candidate, ConstraintInterface $constraint);
+
+// Checks whether $a and $b have any intersection, equivalent to $a->matches($b)
+Intervals::haveIntersections(ConstraintInterface $a, ConstraintInterface $b);
+
+// Optimizes a complex multi constraint by merging all intervals down to the smallest
+// possible multi constraint. The drawbacks are this is not very fast, and the resulting
+// multi constraint will have no human readable prettyConstraint configured on it
+Intervals::compactConstraint(ConstraintInterface $constraint);
+
+// Creates an array of numeric intervals and branch constraints representing a given constraint
+Intervals::get(ConstraintInterface $constraint);
+
+// Clears the memoization cache when you are done processing constraints
+Intervals::clear()
+```
+
+See the class docblocks for more details.
+
+
+License
+-------
+
+composer/semver is licensed under the MIT License, see the LICENSE file for details.

+ 92 - 0
vendor/fakerphp/faker/src/Faker/Container/ContainerBuilder.php

@@ -0,0 +1,92 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Faker\Container;
+
+use Faker\Core;
+use Faker\Extension\BarcodeExtension;
+use Faker\Extension\BloodExtension;
+use Faker\Extension\ColorExtension;
+use Faker\Extension\DateTimeExtension;
+use Faker\Extension\FileExtension;
+use Faker\Extension\NumberExtension;
+use Faker\Extension\UuidExtension;
+use Faker\Extension\VersionExtension;
+
+/**
+ * @experimental This class is experimental and does not fall under our BC promise
+ */
+final class ContainerBuilder
+{
+    /**
+     * @var array<string, callable|object|string>
+     */
+    private $definitions = [];
+
+    /**
+     * @param callable|object|string $value
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function add($value, string $name = null): self
+    {
+        if (!is_string($value) && !is_callable($value) && !is_object($value)) {
+            throw new \InvalidArgumentException(sprintf(
+                'First argument to "%s::add()" must be a string, callable or object.',
+                self::class
+            ));
+        }
+
+        if ($name === null) {
+            if (is_string($value)) {
+                $name = $value;
+            } elseif (is_object($value)) {
+                $name = get_class($value);
+            } else {
+                throw new \InvalidArgumentException(sprintf(
+                    'Second argument to "%s::add()" is required not passing a string or object as first argument',
+                    self::class
+                ));
+            }
+        }
+
+        $this->definitions[$name] = $value;
+
+        return $this;
+    }
+
+    public function build(): ContainerInterface
+    {
+        return new Container($this->definitions);
+    }
+
+    /**
+     * Get an array with extension that represent the default English
+     * functionality.
+     */
+    public static function defaultExtensions(): array
+    {
+        return [
+            BarcodeExtension::class => Core\Barcode::class,
+            BloodExtension::class => Core\Blood::class,
+            ColorExtension::class => Core\Color::class,
+            DateTimeExtension::class => Core\DateTime::class,
+            FileExtension::class => Core\File::class,
+            NumberExtension::class => Core\Number::class,
+            VersionExtension::class => Core\Version::class,
+            UuidExtension::class => Core\Uuid::class,
+        ];
+    }
+
+    public static function getDefault(): ContainerInterface
+    {
+        $instance = new self();
+
+        foreach (self::defaultExtensions() as $id => $definition) {
+            $instance->add($definition, $id);
+        }
+
+        return $instance->build();
+    }
+}

+ 230 - 0
vendor/fakerphp/faker/src/Faker/Core/DateTime.php

@@ -0,0 +1,230 @@
+<?php
+
+namespace Faker\Core;
+
+use Faker\Extension\DateTimeExtension;
+use Faker\Extension\GeneratorAwareExtension;
+use Faker\Extension\GeneratorAwareExtensionTrait;
+use Faker\Extension\Helper;
+
+/**
+ * @experimental
+ *
+ * @since 1.20.0
+ */
+final class DateTime implements DateTimeExtension, GeneratorAwareExtension
+{
+    use GeneratorAwareExtensionTrait;
+
+    /**
+     * @var string[]
+     */
+    private $centuries = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X', 'XI', 'XII', 'XIII', 'XIV', 'XV', 'XVI', 'XVII', 'XVIII', 'XIX', 'XX', 'XXI'];
+
+    /**
+     * @var string
+     */
+    private $defaultTimezone = null;
+
+    /**
+     * Get the POSIX-timestamp of a DateTime, int or string.
+     *
+     * @param \DateTime|float|int|string $until
+     *
+     * @return false|int
+     */
+    protected function getTimestamp($until = 'now')
+    {
+        if (is_numeric($until)) {
+            return (int) $until;
+        }
+
+        if ($until instanceof \DateTime) {
+            return $until->getTimestamp();
+        }
+
+        return strtotime(empty($until) ? 'now' : $until);
+    }
+
+    /**
+     * Get a DateTime created based on a POSIX-timestamp.
+     *
+     * @param int $timestamp the UNIX / POSIX-compatible timestamp
+     */
+    protected function getTimestampDateTime(int $timestamp): \DateTime
+    {
+        return new \DateTime('@' . $timestamp);
+    }
+
+    protected function setDefaultTimezone(string $timezone = null): void
+    {
+        $this->defaultTimezone = $timezone;
+    }
+
+    protected function getDefaultTimezone(): ?string
+    {
+        return $this->defaultTimezone;
+    }
+
+    protected function resolveTimezone(?string $timezone): string
+    {
+        if ($timezone !== null) {
+            return $timezone;
+        }
+
+        return null === $this->defaultTimezone ? date_default_timezone_get() : $this->defaultTimezone;
+    }
+
+    /**
+     * Internal method to set the timezone on a DateTime object.
+     */
+    protected function setTimezone(\DateTime $dateTime, ?string $timezone): \DateTime
+    {
+        $timezone = $this->resolveTimezone($timezone);
+
+        return $dateTime->setTimezone(new \DateTimeZone($timezone));
+    }
+
+    public function dateTime($until = 'now', string $timezone = null): \DateTime
+    {
+        return $this->setTimezone(
+            $this->getTimestampDateTime($this->unixTime($until)),
+            $timezone
+        );
+    }
+
+    public function dateTimeAD($until = 'now', string $timezone = null): \DateTime
+    {
+        $min = (PHP_INT_SIZE > 4) ? -62135597361 : -PHP_INT_MAX;
+
+        return $this->setTimezone(
+            $this->getTimestampDateTime($this->generator->numberBetween($min, $this->getTimestamp($until))),
+            $timezone
+        );
+    }
+
+    public function dateTimeBetween($from = '-30 years', $until = 'now', string $timezone = null): \DateTime
+    {
+        $start = $this->getTimestamp($from);
+        $end = $this->getTimestamp($until);
+
+        if ($start > $end) {
+            throw new \InvalidArgumentException('"$from" must be anterior to "$until".');
+        }
+
+        $timestamp = $this->generator->numberBetween($start, $end);
+
+        return $this->setTimezone(
+            $this->getTimestampDateTime($timestamp),
+            $timezone
+        );
+    }
+
+    public function dateTimeInInterval($from = '-30 years', string $interval = '+5 days', string $timezone = null): \DateTime
+    {
+        $intervalObject = \DateInterval::createFromDateString($interval);
+        $datetime = $from instanceof \DateTime ? $from : new \DateTime($from);
+
+        $other = (clone $datetime)->add($intervalObject);
+
+        $begin = min($datetime, $other);
+        $end = $datetime === $begin ? $other : $datetime;
+
+        return $this->dateTimeBetween($begin, $end, $timezone);
+    }
+
+    public function dateTimeThisWeek($until = 'sunday this week', string $timezone = null): \DateTime
+    {
+        return $this->dateTimeBetween('monday this week', $until, $timezone);
+    }
+
+    public function dateTimeThisMonth($until = 'last day of this month', string $timezone = null): \DateTime
+    {
+        return $this->dateTimeBetween('first day of this month', $until, $timezone);
+    }
+
+    public function dateTimeThisYear($until = 'last day of december', string $timezone = null): \DateTime
+    {
+        return $this->dateTimeBetween('first day of january', $until, $timezone);
+    }
+
+    public function dateTimeThisDecade($until = 'now', string $timezone = null): \DateTime
+    {
+        $year = floor(date('Y') / 10) * 10;
+
+        return $this->dateTimeBetween("first day of january $year", $until, $timezone);
+    }
+
+    public function dateTimeThisCentury($until = 'now', string $timezone = null): \DateTime
+    {
+        $year = floor(date('Y') / 100) * 100;
+
+        return $this->dateTimeBetween("first day of january $year", $until, $timezone);
+    }
+
+    public function date(string $format = 'Y-m-d', $until = 'now'): string
+    {
+        return $this->dateTime($until)->format($format);
+    }
+
+    public function time(string $format = 'H:i:s', $until = 'now'): string
+    {
+        return $this->date($format, $until);
+    }
+
+    public function unixTime($until = 'now'): int
+    {
+        return $this->generator->numberBetween(0, $this->getTimestamp($until));
+    }
+
+    public function iso8601($until = 'now'): string
+    {
+        return $this->date(\DateTime::ISO8601, $until);
+    }
+
+    public function amPm($until = 'now'): string
+    {
+        return $this->date('a', $until);
+    }
+
+    public function dayOfMonth($until = 'now'): string
+    {
+        return $this->date('d', $until);
+    }
+
+    public function dayOfWeek($until = 'now'): string
+    {
+        return $this->date('l', $until);
+    }
+
+    public function month($until = 'now'): string
+    {
+        return $this->date('m', $until);
+    }
+
+    public function monthName($until = 'now'): string
+    {
+        return $this->date('F', $until);
+    }
+
+    public function year($until = 'now'): string
+    {
+        return $this->date('Y', $until);
+    }
+
+    public function century(): string
+    {
+        return Helper::randomElement($this->centuries);
+    }
+
+    public function timezone(string $countryCode = null): string
+    {
+        if ($countryCode) {
+            $timezones = \DateTimeZone::listIdentifiers(\DateTimeZone::PER_COUNTRY, $countryCode);
+        } else {
+            $timezones = \DateTimeZone::listIdentifiers();
+        }
+
+        return Helper::randomElement($timezones);
+    }
+}

+ 0 - 137
vendor/fakerphp/faker/src/Faker/Extension/Container.php

@@ -1,137 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Faker\Extension;
-
-use Psr\Container\ContainerInterface;
-
-/**
- * A simple implementation of a container.
- *
- * @experimental This class is experimental and does not fall under our BC promise
- */
-final class Container implements ContainerInterface
-{
-    /**
-     * @var array<string, callable|object|string>
-     */
-    private $definitions;
-
-    private $services = [];
-
-    /**
-     * Create a container object with a set of definitions. The array value MUST
-     * produce an object that implements Extension.
-     *
-     * @param array<string, callable|object|string> $definitions
-     */
-    public function __construct(array $definitions)
-    {
-        $this->definitions = $definitions;
-    }
-
-    /**
-     * @param string $id
-     *
-     * @throws \InvalidArgumentException
-     * @throws \RuntimeException
-     * @throws ContainerException
-     * @throws NotInContainerException
-     *
-     * @return Extension
-     */
-    public function get($id)
-    {
-        if (!is_string($id)) {
-            throw new \InvalidArgumentException(sprintf(
-                'First argument of %s::get() must be string',
-                self::class
-            ));
-        }
-
-        if (array_key_exists($id, $this->services)) {
-            return $this->services[$id];
-        }
-
-        if (!$this->has($id)) {
-            throw new NotInContainerException(sprintf(
-                'There is not service with id "%s" in the container.',
-                $id
-            ));
-        }
-
-        $definition = $this->definitions[$id];
-
-        if (is_callable($definition)) {
-            try {
-                $service = $definition();
-            } catch (\Throwable $e) {
-                throw new ContainerException(
-                    sprintf(
-                        'Error while invoking callable for "%s"',
-                        $id
-                    ),
-                    0,
-                    $e
-                );
-            }
-        } elseif (is_object($definition)) {
-            $service = $definition;
-        } elseif (is_string($definition)) {
-            if (!class_exists($definition)) {
-                throw new ContainerException(sprintf(
-                    'Could not instantiate class "%s". Class was not found.',
-                    $id
-                ));
-            }
-
-            try {
-                $service = new $definition();
-            } catch (\Throwable $e) {
-                throw new ContainerException(
-                    sprintf(
-                        'Could not instantiate class "%s"',
-                        $id
-                    ),
-                    0,
-                    $e
-                );
-            }
-        } else {
-            throw new ContainerException(sprintf(
-                'Invalid type for definition with id "%s"',
-                $id
-            ));
-        }
-
-        if (!$service instanceof Extension) {
-            throw new \RuntimeException(sprintf(
-                'Service resolved for identifier "%s" does not implement the %s" interface.',
-                $id,
-                Extension::class
-            ));
-        }
-
-        $this->services[$id] = $service;
-
-        return $service;
-    }
-
-    /**
-     * @param string $id
-     *
-     * @throws \InvalidArgumentException
-     */
-    public function has($id): bool
-    {
-        if (!is_string($id)) {
-            throw new \InvalidArgumentException(sprintf(
-                'First argument of %s::get() must be string',
-                self::class
-            ));
-        }
-
-        return array_key_exists($id, $this->definitions);
-    }
-}

+ 0 - 14
vendor/fakerphp/faker/src/Faker/Extension/NotInContainerException.php

@@ -1,14 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Faker\Extension;
-
-use Psr\Container\NotFoundExceptionInterface;
-
-/**
- * @experimental This class is experimental and does not fall under our BC promise
- */
-final class NotInContainerException extends \RuntimeException implements NotFoundExceptionInterface
-{
-}

+ 0 - 22
vendor/phpdocumentor/reflection-common/LICENSE

@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 phpDocumentor
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-

+ 109 - 0
vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/Memory/SimpleCache3.php

@@ -0,0 +1,109 @@
+<?php
+
+namespace PhpOffice\PhpSpreadsheet\Collection\Memory;
+
+use DateInterval;
+use Psr\SimpleCache\CacheInterface;
+
+/**
+ * This is the default implementation for in-memory cell collection.
+ *
+ * Alternatives implementation should leverage off-memory, non-volatile storage
+ * to reduce overall memory usage.
+ */
+class SimpleCache3 implements CacheInterface
+{
+    /**
+     * @var array Cell Cache
+     */
+    private $cache = [];
+
+    public function clear(): bool
+    {
+        $this->cache = [];
+
+        return true;
+    }
+
+    /**
+     * @param string $key
+     */
+    public function delete($key): bool
+    {
+        unset($this->cache[$key]);
+
+        return true;
+    }
+
+    /**
+     * @param iterable $keys
+     */
+    public function deleteMultiple($keys): bool
+    {
+        foreach ($keys as $key) {
+            $this->delete($key);
+        }
+
+        return true;
+    }
+
+    /**
+     * @param string $key
+     * @param mixed  $default
+     */
+    public function get($key, $default = null): mixed
+    {
+        if ($this->has($key)) {
+            return $this->cache[$key];
+        }
+
+        return $default;
+    }
+
+    /**
+     * @param iterable $keys
+     * @param mixed    $default
+     */
+    public function getMultiple($keys, $default = null): iterable
+    {
+        $results = [];
+        foreach ($keys as $key) {
+            $results[$key] = $this->get($key, $default);
+        }
+
+        return $results;
+    }
+
+    /**
+     * @param string $key
+     */
+    public function has($key): bool
+    {
+        return array_key_exists($key, $this->cache);
+    }
+
+    /**
+     * @param string                 $key
+     * @param mixed                  $value
+     * @param null|DateInterval|int $ttl
+     */
+    public function set($key, $value, $ttl = null): bool
+    {
+        $this->cache[$key] = $value;
+
+        return true;
+    }
+
+    /**
+     * @param iterable               $values
+     * @param null|DateInterval|int $ttl
+     */
+    public function setMultiple($values, $ttl = null): bool
+    {
+        foreach ($values as $key => $value) {
+            $this->set($key, $value);
+        }
+
+        return true;
+    }
+}