From faf3d090843ca9c1873a5ff4abbb1513d2a5c778 Mon Sep 17 00:00:00 2001 From: Edward Yang Date: Thu, 21 Jul 2022 18:36:46 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=A7=E6=89=BF=20base=20model?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- beike/Models/Address.php | 5 +- beike/Models/Base.php | 19 +++ beike/Models/Cart.php | 4 +- beike/Models/CartProduct.php | 3 +- beike/Models/Category.php | 3 +- beike/Models/CategoryDescription.php | 3 +- beike/Models/CategoryPath.php | 3 +- beike/Models/Country.php | 3 +- beike/Models/Currency.php | 3 +- beike/Models/CustomerGroup.php | 6 +- beike/Models/CustomerGroupDescription.php | 3 +- beike/Models/CustomerWishlist.php | 3 +- beike/Models/Language.php | 3 +- beike/Models/Order.php | 3 +- beike/Models/OrderProduct.php | 4 +- beike/Models/Plugin.php | 4 +- beike/Models/Product.php | 5 +- beike/Models/ProductCategory.php | 4 +- beike/Models/ProductDescription.php | 3 +- beike/Models/ProductSku.php | 3 +- beike/Models/Region.php | 22 ++++ beike/Models/Setting.php | 3 +- beike/Models/VerifyCode.php | 3 +- beike/Models/Zone.php | 3 +- beike/Services/TaxService.php | 140 ++++++++++++++++++++++ 25 files changed, 205 insertions(+), 53 deletions(-) create mode 100644 beike/Models/Base.php create mode 100644 beike/Models/Region.php create mode 100644 beike/Services/TaxService.php diff --git a/beike/Models/Address.php b/beike/Models/Address.php index fef6e122..d282956d 100644 --- a/beike/Models/Address.php +++ b/beike/Models/Address.php @@ -11,11 +11,10 @@ namespace Beike\Models; -use Illuminate\Database\Eloquent\Model; -use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Factories\HasFactory; -class Address extends Model +class Address extends Base { use HasFactory; diff --git a/beike/Models/Base.php b/beike/Models/Base.php new file mode 100644 index 00000000..615d5965 --- /dev/null +++ b/beike/Models/Base.php @@ -0,0 +1,19 @@ + + * @created 2022-07-21 18:27:45 + * @modified 2022-07-21 18:27:45 + */ + +namespace Beike\Models; + +use Illuminate\Database\Eloquent\Model; + +class Base extends Model +{ + +} diff --git a/beike/Models/Cart.php b/beike/Models/Cart.php index 647f4b3a..b5cc7499 100644 --- a/beike/Models/Cart.php +++ b/beike/Models/Cart.php @@ -2,11 +2,9 @@ namespace Beike\Models; -use Illuminate\Database\Eloquent\Model; -use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Factories\HasFactory; -class Cart extends Model +class Cart extends Base { use HasFactory; diff --git a/beike/Models/CartProduct.php b/beike/Models/CartProduct.php index f617f8cb..e87c4b97 100644 --- a/beike/Models/CartProduct.php +++ b/beike/Models/CartProduct.php @@ -12,10 +12,9 @@ namespace Beike\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; -use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; -class CartProduct extends Model +class CartProduct extends Base { use HasFactory; diff --git a/beike/Models/Category.php b/beike/Models/Category.php index 6ead15c7..0ac115d7 100644 --- a/beike/Models/Category.php +++ b/beike/Models/Category.php @@ -2,12 +2,11 @@ namespace Beike\Models; -use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Factories\HasFactory; -class Category extends Model +class Category extends Base { use HasFactory; diff --git a/beike/Models/CategoryDescription.php b/beike/Models/CategoryDescription.php index 5284a88b..c71c3b71 100644 --- a/beike/Models/CategoryDescription.php +++ b/beike/Models/CategoryDescription.php @@ -3,9 +3,8 @@ namespace Beike\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; -use Illuminate\Database\Eloquent\Model; -class CategoryDescription extends Model +class CategoryDescription extends Base { use HasFactory; diff --git a/beike/Models/CategoryPath.php b/beike/Models/CategoryPath.php index c022e9ec..cdd8ec54 100644 --- a/beike/Models/CategoryPath.php +++ b/beike/Models/CategoryPath.php @@ -3,10 +3,9 @@ namespace Beike\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; -use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasOne; -class CategoryPath extends Model +class CategoryPath extends Base { use HasFactory; diff --git a/beike/Models/Country.php b/beike/Models/Country.php index 1a8644ee..80f73462 100644 --- a/beike/Models/Country.php +++ b/beike/Models/Country.php @@ -11,11 +11,10 @@ namespace Beike\Models; -use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Relations\HasMany; -class Country extends Model +class Country extends Base { use HasFactory; diff --git a/beike/Models/Currency.php b/beike/Models/Currency.php index a6855d83..8677a2e3 100644 --- a/beike/Models/Currency.php +++ b/beike/Models/Currency.php @@ -11,10 +11,9 @@ namespace Beike\Models; -use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; -class Currency extends Model +class Currency extends Base { use HasFactory; diff --git a/beike/Models/CustomerGroup.php b/beike/Models/CustomerGroup.php index 2695f48b..e3f3da00 100644 --- a/beike/Models/CustomerGroup.php +++ b/beike/Models/CustomerGroup.php @@ -3,12 +3,8 @@ namespace Beike\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; -use Illuminate\Database\Eloquent\Model; -use Illuminate\Database\Eloquent\Relations\HasMany; -use Illuminate\Database\Eloquent\SoftDeletes; -use Illuminate\Foundation\Auth\User as Authenticatable; -class CustomerGroup extends Model +class CustomerGroup extends Base { use HasFactory; diff --git a/beike/Models/CustomerGroupDescription.php b/beike/Models/CustomerGroupDescription.php index 9441dd97..5ea4e268 100644 --- a/beike/Models/CustomerGroupDescription.php +++ b/beike/Models/CustomerGroupDescription.php @@ -3,9 +3,8 @@ namespace Beike\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; -use Illuminate\Database\Eloquent\Model; -class CustomerGroupDescription extends Model +class CustomerGroupDescription extends Base { use HasFactory; diff --git a/beike/Models/CustomerWishlist.php b/beike/Models/CustomerWishlist.php index 231e7491..a4ffad26 100644 --- a/beike/Models/CustomerWishlist.php +++ b/beike/Models/CustomerWishlist.php @@ -3,10 +3,9 @@ namespace Beike\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; -use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasOne; -class CustomerWishlist extends Model +class CustomerWishlist extends Base { use HasFactory; diff --git a/beike/Models/Language.php b/beike/Models/Language.php index c90616a0..73affe08 100644 --- a/beike/Models/Language.php +++ b/beike/Models/Language.php @@ -11,10 +11,9 @@ namespace Beike\Models; -use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; -class Language extends Model +class Language extends Base { use HasFactory; diff --git a/beike/Models/Order.php b/beike/Models/Order.php index 8a97dfdc..38f7f432 100644 --- a/beike/Models/Order.php +++ b/beike/Models/Order.php @@ -11,10 +11,9 @@ namespace Beike\Models; -use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; -class Order extends Model +class Order extends Base { protected $fillable = [ 'number', 'customer_id', 'customer_group_id', 'shipping_address_id', 'payment_address_id', 'customer_name', diff --git a/beike/Models/OrderProduct.php b/beike/Models/OrderProduct.php index f402894b..12728dc0 100644 --- a/beike/Models/OrderProduct.php +++ b/beike/Models/OrderProduct.php @@ -11,9 +11,7 @@ namespace Beike\Models; -use Illuminate\Database\Eloquent\Model; - -class OrderProduct extends Model +class OrderProduct extends Base { protected $fillable = [ 'product_id', 'order_number', 'product_sku', 'name', 'image', 'quantity', 'price', diff --git a/beike/Models/Plugin.php b/beike/Models/Plugin.php index da4070f3..124cd924 100644 --- a/beike/Models/Plugin.php +++ b/beike/Models/Plugin.php @@ -11,9 +11,7 @@ namespace Beike\Models; -use Illuminate\Database\Eloquent\Model; - -class Plugin extends Model +class Plugin extends Base { protected $fillable = ['type', 'code']; } diff --git a/beike/Models/Product.php b/beike/Models/Product.php index 238d7b0e..758a5bc9 100644 --- a/beike/Models/Product.php +++ b/beike/Models/Product.php @@ -2,11 +2,10 @@ namespace Beike\Models; -use Illuminate\Database\Eloquent\Factories\HasFactory; -use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; +use Illuminate\Database\Eloquent\Factories\HasFactory; -class Product extends Model +class Product extends Base { use HasFactory; use SoftDeletes; diff --git a/beike/Models/ProductCategory.php b/beike/Models/ProductCategory.php index 9392c066..d21aa6e6 100644 --- a/beike/Models/ProductCategory.php +++ b/beike/Models/ProductCategory.php @@ -11,9 +11,7 @@ namespace Beike\Models; -use Illuminate\Database\Eloquent\Model; - -class ProductCategory extends Model +class ProductCategory extends Base { protected $table = 'product_categories'; protected $fillable = ['product_id', 'category_id']; diff --git a/beike/Models/ProductDescription.php b/beike/Models/ProductDescription.php index 65e12212..309e2019 100644 --- a/beike/Models/ProductDescription.php +++ b/beike/Models/ProductDescription.php @@ -3,9 +3,8 @@ namespace Beike\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; -use Illuminate\Database\Eloquent\Model; -class ProductDescription extends Model +class ProductDescription extends Base { use HasFactory; diff --git a/beike/Models/ProductSku.php b/beike/Models/ProductSku.php index 4d1e33b1..35c86c52 100644 --- a/beike/Models/ProductSku.php +++ b/beike/Models/ProductSku.php @@ -3,9 +3,8 @@ namespace Beike\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; -use Illuminate\Database\Eloquent\Model; -class ProductSku extends Model +class ProductSku extends Base { use HasFactory; diff --git a/beike/Models/Region.php b/beike/Models/Region.php new file mode 100644 index 00000000..8d71aa09 --- /dev/null +++ b/beike/Models/Region.php @@ -0,0 +1,22 @@ + + * @created 2022-07-21 16:55:16 + * @modified 2022-07-21 16:55:16 + */ + +namespace Beike\Models; + +use Illuminate\Database\Eloquent\Relations\BelongsToMany; + +class Region extends Base +{ + public function zones(): BelongsToMany + { + return $this->belongsToMany(Zone::class, 'region_zones'); + } +} diff --git a/beike/Models/Setting.php b/beike/Models/Setting.php index 86d65116..8adefcf6 100644 --- a/beike/Models/Setting.php +++ b/beike/Models/Setting.php @@ -2,10 +2,9 @@ namespace Beike\Models; -use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; -class Setting extends Model +class Setting extends Base { use HasFactory; diff --git a/beike/Models/VerifyCode.php b/beike/Models/VerifyCode.php index f73a8538..b2bf8190 100644 --- a/beike/Models/VerifyCode.php +++ b/beike/Models/VerifyCode.php @@ -11,11 +11,10 @@ namespace Beike\Models; -use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\SoftDeletes; -class VerifyCode extends Model +class VerifyCode extends Base { use HasFactory; use SoftDeletes; diff --git a/beike/Models/Zone.php b/beike/Models/Zone.php index 169a3a20..bea84a75 100644 --- a/beike/Models/Zone.php +++ b/beike/Models/Zone.php @@ -11,10 +11,9 @@ namespace Beike\Models; -use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; -class Zone extends Model +class Zone extends Base { use HasFactory; diff --git a/beike/Services/TaxService.php b/beike/Services/TaxService.php new file mode 100644 index 00000000..e7897bbf --- /dev/null +++ b/beike/Services/TaxService.php @@ -0,0 +1,140 @@ + + * @created 2022-07-21 16:29:54 + * @modified 2022-07-21 16:29:54 + */ + +namespace Beike\Services; + +class TaxService +{ + private $tax_rates = array(); + + public function __construct($registry) { + $this->config = $registry->get('config'); + $this->db = $registry->get('db'); + } + + public function unsetRates() { + $this->tax_rates = array(); + } + + public function setShippingAddress($country_id, $zone_id) { + $tax_query = $this->db->query("SELECT tr1.tax_class_id, tr2.tax_rate_id, tr2.name, tr2.rate, tr2.type, tr1.priority FROM " . DB_PREFIX . "tax_rule tr1 LEFT JOIN " . DB_PREFIX . "tax_rate tr2 ON (tr1.tax_rate_id = tr2.tax_rate_id) INNER JOIN " . DB_PREFIX . "tax_rate_to_customer_group tr2cg ON (tr2.tax_rate_id = tr2cg.tax_rate_id) LEFT JOIN " . DB_PREFIX . "zone_to_geo_zone z2gz ON (tr2.geo_zone_id = z2gz.geo_zone_id) LEFT JOIN " . DB_PREFIX . "geo_zone gz ON (tr2.geo_zone_id = gz.geo_zone_id) WHERE tr1.based = 'shipping' AND tr2cg.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND z2gz.country_id = '" . (int)$country_id . "' AND (z2gz.zone_id = '0' OR z2gz.zone_id = '" . (int)$zone_id . "') ORDER BY tr1.priority ASC"); + + foreach ($tax_query->rows as $result) { + $this->tax_rates[$result['tax_class_id']][$result['tax_rate_id']] = array( + 'tax_rate_id' => $result['tax_rate_id'], + 'name' => $result['name'], + 'rate' => $result['rate'], + 'type' => $result['type'], + 'priority' => $result['priority'] + ); + } + } + + public function setPaymentAddress($country_id, $zone_id) { + $tax_query = $this->db->query("SELECT tr1.tax_class_id, tr2.tax_rate_id, tr2.name, tr2.rate, tr2.type, tr1.priority FROM " . DB_PREFIX . "tax_rule tr1 LEFT JOIN " . DB_PREFIX . "tax_rate tr2 ON (tr1.tax_rate_id = tr2.tax_rate_id) INNER JOIN " . DB_PREFIX . "tax_rate_to_customer_group tr2cg ON (tr2.tax_rate_id = tr2cg.tax_rate_id) LEFT JOIN " . DB_PREFIX . "zone_to_geo_zone z2gz ON (tr2.geo_zone_id = z2gz.geo_zone_id) LEFT JOIN " . DB_PREFIX . "geo_zone gz ON (tr2.geo_zone_id = gz.geo_zone_id) WHERE tr1.based = 'payment' AND tr2cg.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND z2gz.country_id = '" . (int)$country_id . "' AND (z2gz.zone_id = '0' OR z2gz.zone_id = '" . (int)$zone_id . "') ORDER BY tr1.priority ASC"); + + foreach ($tax_query->rows as $result) { + $this->tax_rates[$result['tax_class_id']][$result['tax_rate_id']] = array( + 'tax_rate_id' => $result['tax_rate_id'], + 'name' => $result['name'], + 'rate' => $result['rate'], + 'type' => $result['type'], + 'priority' => $result['priority'] + ); + } + } + + public function setStoreAddress($country_id, $zone_id) { + $tax_query = $this->db->query("SELECT tr1.tax_class_id, tr2.tax_rate_id, tr2.name, tr2.rate, tr2.type, tr1.priority FROM " . DB_PREFIX . "tax_rule tr1 LEFT JOIN " . DB_PREFIX . "tax_rate tr2 ON (tr1.tax_rate_id = tr2.tax_rate_id) INNER JOIN " . DB_PREFIX . "tax_rate_to_customer_group tr2cg ON (tr2.tax_rate_id = tr2cg.tax_rate_id) LEFT JOIN " . DB_PREFIX . "zone_to_geo_zone z2gz ON (tr2.geo_zone_id = z2gz.geo_zone_id) LEFT JOIN " . DB_PREFIX . "geo_zone gz ON (tr2.geo_zone_id = gz.geo_zone_id) WHERE tr1.based = 'store' AND tr2cg.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND z2gz.country_id = '" . (int)$country_id . "' AND (z2gz.zone_id = '0' OR z2gz.zone_id = '" . (int)$zone_id . "') ORDER BY tr1.priority ASC"); + + foreach ($tax_query->rows as $result) { + $this->tax_rates[$result['tax_class_id']][$result['tax_rate_id']] = array( + 'tax_rate_id' => $result['tax_rate_id'], + 'name' => $result['name'], + 'rate' => $result['rate'], + 'type' => $result['type'], + 'priority' => $result['priority'] + ); + } + } + + public function calculate($value, $tax_class_id, $calculate = true) { + if ($tax_class_id && $calculate) { + $amount = 0; + + $tax_rates = $this->getRates($value, $tax_class_id); + + foreach ($tax_rates as $tax_rate) { + if ($calculate != 'P' && $calculate != 'F') { + $amount += $tax_rate['amount']; + } elseif ($tax_rate['type'] == $calculate) { + $amount += $tax_rate['amount']; + } + } + + return $value + $amount; + } else { + return $value; + } + } + + public function getTax($value, $tax_class_id) { + $amount = 0; + + $tax_rates = $this->getRates($value, $tax_class_id); + + foreach ($tax_rates as $tax_rate) { + $amount += $tax_rate['amount']; + } + + return $amount; + } + + public function getRateName($tax_rate_id) { + $tax_query = $this->db->query("SELECT name FROM " . DB_PREFIX . "tax_rate WHERE tax_rate_id = '" . (int)$tax_rate_id . "'"); + + if ($tax_query->num_rows) { + return $tax_query->row['name']; + } else { + return false; + } + } + + public function getRates($value, $tax_class_id) { + $tax_rate_data = array(); + + if (isset($this->tax_rates[$tax_class_id])) { + foreach ($this->tax_rates[$tax_class_id] as $tax_rate) { + if (isset($tax_rate_data[$tax_rate['tax_rate_id']])) { + $amount = $tax_rate_data[$tax_rate['tax_rate_id']]['amount']; + } else { + $amount = 0; + } + + if ($tax_rate['type'] == 'F') { + $amount += $tax_rate['rate']; + } elseif ($tax_rate['type'] == 'P') { + $amount += ($value / 100 * $tax_rate['rate']); + } + + $tax_rate_data[$tax_rate['tax_rate_id']] = array( + 'tax_rate_id' => $tax_rate['tax_rate_id'], + 'name' => $tax_rate['name'], + 'rate' => $tax_rate['rate'], + 'type' => $tax_rate['type'], + 'amount' => $amount + ); + } + } + + return $tax_rate_data; + } +}