You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

240 lines
9.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
}