|
|
package rate
|
|
|
|
|
|
import (
|
|
|
"fmt"
|
|
|
mysql2 "git.oa00.com/go/mysql"
|
|
|
"github.com/shopspring/decimal"
|
|
|
"recook/internal/v2/model/gys"
|
|
|
"recook/internal/v2/model/gys/enterprise"
|
|
|
"recook/internal/v2/model/recook/goods"
|
|
|
)
|
|
|
|
|
|
type Calculation struct {
|
|
|
}
|
|
|
|
|
|
//var CalculationRate = &Calculation{}
|
|
|
|
|
|
//预估净毛利率计算
|
|
|
//团奖=卷后价*团奖率 10.5%
|
|
|
//云账户服务费=(佣金+团奖)*0.007
|
|
|
//增值税率=增值结算税率(目前为0%)
|
|
|
//增值税及附加税=([卷后价/(1+结算税率)-采购价/((1+结算税率))]*结算税率-(佣金+团奖)*1.007/1.06*0.06)*1.12
|
|
|
//预估净毛利=卷后价-采购价-佣金-团奖-增值税及附加税-云账户服务费
|
|
|
//预估净毛利率=预估毛利/[卷后价/(1+结算税率)]
|
|
|
/*
|
|
|
新版规则
|
|
|
平台供货价
|
|
|
采购价=平台供货价*各运营方对应的系数
|
|
|
团奖率(固定10.5%)
|
|
|
团奖=券后价*团奖率
|
|
|
增值税率(抓取结算税率)
|
|
|
增值税及附加税=(【券后价/(1+平台开票税率)-采购价/(1+抵扣税率)】*平台开票税率-(佣金+团奖)*1.07/1.06*0.06)*1.12
|
|
|
云账户服务费=(佣金+团奖)*0.07
|
|
|
预估净毛利=券后价-采购价-佣金-团奖-增值税及附加税-云账户服务费
|
|
|
预估净毛利率=预估净毛利/【券后价/(1+结算税率)】
|
|
|
*/
|
|
|
//sku计算的结果
|
|
|
type NewGoodsSkuRest struct {
|
|
|
SkuId uint `json:"sku_id"`
|
|
|
CaigouPrice decimal.Decimal `json:"caigou_price"` //采购价
|
|
|
TeamBonus decimal.Decimal `json:"team_bonus"` //团奖
|
|
|
TaxRate decimal.Decimal `json:"tax_rate"` //增值税率
|
|
|
VATSurtax decimal.Decimal `json:"vat_surtax"` //增值税及附加税
|
|
|
YunPrice decimal.Decimal `json:"yun_price"` //云账户费用
|
|
|
EstimatedNetGrossProfit decimal.Decimal `json:"estimated_net_gross_profit"` //预估净毛利
|
|
|
EstimatedNetGrossMargin decimal.Decimal `json:"estimated_net_gross_margin"` //预估净毛利率
|
|
|
Code string `json:"code"`
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
新版本:国内
|
|
|
增值税及附加税={[券后价/(1+平台开票税率)*平台开票税率-采购价/(1+抵扣税率)*抵扣税率 ]-(佣金+团奖+云账户服务费)/1.06*0.06}*1.12
|
|
|
预估净毛利=券后价-采购价-佣金-团奖-云账户服务费-增值税及附加税
|
|
|
预估净毛利率=预估净毛利/[券后价/(1+平台开票税率)]
|
|
|
云账户服务费=(佣金+团奖)*0.07
|
|
|
*/
|
|
|
//国内仓库商品毛利率算法
|
|
|
func (c *Calculation) GrossProfitRate(goodsId uint, cMap map[string]decimal.Decimal) (rest []NewGoodsSkuRest) {
|
|
|
|
|
|
//goods_info表商品基础信息
|
|
|
var goodsInfo goods.RecookGoodsInfoModel
|
|
|
mysql2.Db.Model(&goods.RecookGoodsInfoModel{}).First(&goodsInfo, "id=?", goodsId)
|
|
|
//sku表多规则商品sku信息
|
|
|
var goodsSku []goods.RecookGoodsSkuModel
|
|
|
mysql2.Db.Model(&goods.RecookGoodsSkuModel{}).Find(&goodsSku, "goods_id=?", goodsId)
|
|
|
//采购系数
|
|
|
var caigou gys.GysSourceModel
|
|
|
q1 := mysql2.Db.Model(&enterprise.GysEnterpriseStateModel{}).Where("user_id=?", goodsInfo.VendorID).Select("source")
|
|
|
mysql2.Db.Model(gys.GysSourceModel{}).Where("id in(?)", q1).Find(&caigou)
|
|
|
|
|
|
for _, v := range goodsSku {
|
|
|
discountPrice := v.DiscountPrice
|
|
|
fmt.Println("卷后价")
|
|
|
commissionRate := v.CommissionRate
|
|
|
if _, ok := cMap["new_discount_price"]; ok {
|
|
|
if num := cMap["new_discount_price"]; num.GreaterThan(decimal.NewFromFloat(0)) {
|
|
|
discountPrice = num
|
|
|
}
|
|
|
//存在
|
|
|
//discountPrice = cMap["new_discount_price"]
|
|
|
}
|
|
|
if _, ok := cMap["new_commission_rate"]; ok {
|
|
|
if num := cMap["new_commission_rate"]; num.GreaterThan(decimal.NewFromFloat(0)) {
|
|
|
commissionRate = cMap["new_commission_rate"]
|
|
|
}
|
|
|
//commissionRate = cMap["new_commission_rate"]
|
|
|
}
|
|
|
//佣金
|
|
|
commission := discountPrice.Mul(commissionRate).Truncate(4)
|
|
|
//税率表,税率信息
|
|
|
var goodsRate goods.RecookSkuInvoiceModel
|
|
|
mysql2.Db.Model(&goods.RecookSkuInvoiceModel{}).First(&goodsRate, "sku_id=?", v.Id)
|
|
|
//采购价
|
|
|
caigouPrice := v.PurchasePrice.Mul(caigou.Coefficient).Truncate(4)
|
|
|
if _, ok := cMap["new_purchase_price"]; ok {
|
|
|
if num := cMap["new_purchase_price"]; num.GreaterThan(decimal.NewFromFloat(0)) {
|
|
|
caigouPrice = cMap["new_purchase_price"].Mul(caigou.Coefficient).Truncate(4)
|
|
|
}
|
|
|
//存在
|
|
|
//caigouPrice = cMap["new_purchase_price"].Mul(caigou.Coefficient).Truncate(4)
|
|
|
}
|
|
|
//团奖
|
|
|
teamBonus := discountPrice.Mul(decimal.NewFromFloat(0.07)).Truncate(4)
|
|
|
/*
|
|
|
增值税及附加税={[券后价/(1+平台开票税率)*平台开票税率-采购价/(1+抵扣税率)*抵扣税率 ]-(佣金+团奖+云账户服务费)/1.06*0.06}*1.12
|
|
|
*/
|
|
|
percent := decimal.NewFromFloat(100)
|
|
|
one := decimal.NewFromFloat(1)
|
|
|
//平台税率
|
|
|
pr := goodsRate.PlatformRate.Div(percent).Truncate(4)
|
|
|
//抵扣税率
|
|
|
dr := goodsRate.DeductionRate.Div(percent).Truncate(4)
|
|
|
//开票税率
|
|
|
tr := goodsRate.TaxRate.Div(percent).Truncate(4)
|
|
|
//券后价/(1+平台开票税率)*平台开票税率
|
|
|
n1 := discountPrice.Div(one.Add(pr)).Mul(pr)
|
|
|
//采购价/(1+抵扣税率)*抵扣税率
|
|
|
n2 := caigouPrice.Div(one.Add(dr)).Mul(dr)
|
|
|
//云账户服务费=(佣金+团奖)*0.07
|
|
|
yun := (commission.Add(teamBonus)).Mul(decimal.NewFromFloat(0.07)).Truncate(4)
|
|
|
//(佣金+团奖+云账户服务费)/1.06*0.06
|
|
|
n3 := commission.Add(teamBonus).Add(yun).Div(decimal.NewFromFloat(1.06)).Mul(decimal.NewFromFloat(0.06))
|
|
|
//增值税及附加税
|
|
|
vat := n1.Sub(n2).Sub(n3).Mul(decimal.NewFromFloat(1.12))
|
|
|
|
|
|
/*预估净毛利=券后价-采购价-佣金-团奖-云账户服务费-增值税及附加税*/
|
|
|
est := discountPrice.Sub(caigouPrice).Sub(commission).Sub(teamBonus).Sub(vat).Sub(yun).Truncate(4)
|
|
|
|
|
|
/*预估净毛利率=预估净毛利/【券后价/(1+结算税率)】*/
|
|
|
remain := discountPrice.Div(one.Add(tr))
|
|
|
estM := est.Div(remain).Truncate(4)
|
|
|
|
|
|
re := NewGoodsSkuRest{
|
|
|
CaigouPrice: caigouPrice,
|
|
|
TeamBonus: teamBonus,
|
|
|
TaxRate: goodsRate.TaxRate,
|
|
|
VATSurtax: vat,
|
|
|
YunPrice: yun,
|
|
|
EstimatedNetGrossProfit: est,
|
|
|
EstimatedNetGrossMargin: estM,
|
|
|
Code: v.Code,
|
|
|
SkuId: v.Id,
|
|
|
}
|
|
|
rest = append(rest, re)
|
|
|
}
|
|
|
return rest
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
跨境商品:
|
|
|
什么是增值税及附加税
|
|
|
增值税及附加税=(服务费-佣金-团奖-云账户服务费)/1.06*0.06*1.12
|
|
|
什么是云账户服务费
|
|
|
云账户服务费=(佣金+团奖)*0.07
|
|
|
什么是预估净毛利
|
|
|
预估净毛利=服务费-佣金-团奖-云账户服务费-增值税及附加税
|
|
|
什么是预估净毛利率
|
|
|
预估净毛利率=预估净毛利/(服务费/1.06)
|
|
|
*/
|
|
|
|
|
|
//GrossProfitRateAbort 国外仓的商品,预估毛利率
|
|
|
func (c *Calculation) GrossProfitRateAbort(goodsId uint, cMap map[string]decimal.Decimal) (rest []NewGoodsSkuRest) {
|
|
|
//goods_info表商品基础信息
|
|
|
var goodsInfo goods.RecookGoodsInfoModel
|
|
|
mysql2.Db.Model(&goods.RecookGoodsInfoModel{}).First(&goodsInfo, "id=?", goodsId)
|
|
|
//sku表多规则商品sku信息
|
|
|
var goodsSku []goods.RecookGoodsSkuModel
|
|
|
mysql2.Db.Model(&goods.RecookGoodsSkuModel{}).Find(&goodsSku, "goods_id=?", goodsId)
|
|
|
//采购系数
|
|
|
var caigou gys.GysSourceModel
|
|
|
q1 := mysql2.Db.Model(&enterprise.GysEnterpriseStateModel{}).Where("user_id=?", goodsInfo.VendorID).Select("source")
|
|
|
mysql2.Db.Model(gys.GysSourceModel{}).Where("id in(?)", q1).Find(&caigou)
|
|
|
|
|
|
for _, v := range goodsSku {
|
|
|
discountPrice := v.DiscountPrice
|
|
|
commissionRate := v.CommissionRate
|
|
|
if _, ok := cMap["new_discount_price"]; ok {
|
|
|
//存在
|
|
|
if num := cMap["new_discount_price"]; num.GreaterThan(decimal.NewFromFloat(0)) {
|
|
|
discountPrice = num
|
|
|
}
|
|
|
}
|
|
|
if _, ok := cMap["new_commission_rate"]; ok {
|
|
|
if num := cMap["new_commission_rate"]; num.GreaterThan(decimal.NewFromFloat(0)) {
|
|
|
commissionRate = num
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//佣金
|
|
|
commission := discountPrice.Mul(commissionRate).Truncate(4)
|
|
|
//采购价
|
|
|
caigouPrice := v.PurchasePrice.Truncate(4)
|
|
|
if _, ok := cMap["new_purchase_price"]; ok {
|
|
|
//存在
|
|
|
if num := cMap["new_purchase_price"]; num.GreaterThan(decimal.NewFromFloat(0)) {
|
|
|
caigouPrice = cMap["new_purchase_price"].Truncate(4)
|
|
|
}
|
|
|
}
|
|
|
//团奖
|
|
|
teamBonus := discountPrice.Mul(decimal.NewFromFloat(0.07)).Truncate(4)
|
|
|
fmt.Println("团奖:", teamBonus)
|
|
|
|
|
|
//云账户服务费=(佣金+团奖)*0.07
|
|
|
yun := (commission.Add(teamBonus)).Mul(decimal.NewFromFloat(0.07)).Truncate(4)
|
|
|
fmt.Println("云:", yun)
|
|
|
//卷后价
|
|
|
//discountPrice := v.DiscountPrice
|
|
|
fmt.Println(discountPrice, caigouPrice)
|
|
|
//1.06
|
|
|
num106 := decimal.NewFromFloat(1.06)
|
|
|
num006 := decimal.NewFromFloat(0.06)
|
|
|
num112 := decimal.NewFromFloat(1.12)
|
|
|
|
|
|
//服务费
|
|
|
fuwu := discountPrice.Sub(caigouPrice)
|
|
|
fmt.Println("服务费:", fuwu)
|
|
|
/*增值税及附加税=(服务费-佣金-团奖-云账户服务费)/1.06*0.06*1.12*/
|
|
|
vat := fuwu.Sub(commission).Sub(teamBonus).Sub(yun).Div(num106).Mul(num006).Mul(num112)
|
|
|
fmt.Println("增值:", vat)
|
|
|
//预估净毛利=服务费-佣金-团奖-云账户服务费-增值税及附加税
|
|
|
maoli := fuwu.Sub(commission).Sub(teamBonus).Sub(yun).Sub(vat).Truncate(4)
|
|
|
fmt.Println("毛利:", maoli)
|
|
|
//预估净毛利率=预估净毛利/(服务费/1.06)
|
|
|
maolilv := maoli.Div(fuwu.Div(num106)).Truncate(4)
|
|
|
fmt.Println("毛利率:", maolilv)
|
|
|
|
|
|
rest = append(rest, NewGoodsSkuRest{
|
|
|
CaigouPrice: caigouPrice,
|
|
|
TeamBonus: teamBonus,
|
|
|
VATSurtax: vat,
|
|
|
YunPrice: yun,
|
|
|
EstimatedNetGrossProfit: maoli,
|
|
|
EstimatedNetGrossMargin: maolilv,
|
|
|
Code: v.Code,
|
|
|
SkuId: v.Id,
|
|
|
})
|
|
|
}
|
|
|
fmt.Println(rest)
|
|
|
return rest
|
|
|
}
|