slave salary

This commit is contained in:
jiangyong27 2024-11-05 12:44:09 +08:00
parent b039d1fcf8
commit 26fb5fdb6f
7 changed files with 98 additions and 26 deletions

View File

@ -66,7 +66,7 @@ func (d *StaffSalaryDao) GetBy(username, month string) (*model.StaffSalary, erro
return &u, nil
}
func (d *StaffSalaryDao) Query(month, username string) ([]*model.StaffSalary, error) {
func (d *StaffSalaryDao) Query(month, username string, master *string) ([]*model.StaffSalary, error) {
var u []*model.StaffSalary
tx := GetDB().Table(d.TableName())
if month != "" {
@ -75,6 +75,10 @@ func (d *StaffSalaryDao) Query(month, username string) ([]*model.StaffSalary, er
if username != "" {
tx.Where("username = ?", username)
}
if master != nil {
tx.Where("master = ?", *master)
}
tx.Order("month DESC")
res := tx.Find(&u)

View File

@ -9,6 +9,7 @@ type StaffInfo struct {
Id int64
Username string
Realname string
Master string
AlipayUid string
StaffType string
Phone string

View File

@ -15,6 +15,7 @@ var (
type StaffSalary struct {
Id int64
Username string
Master string
Month string
BaseSalary float64
PerfSalary float64
@ -33,11 +34,18 @@ type StaffSalary struct {
}
func (s *StaffSalary) GetRealSalary() float64 {
return butil.FloatCut(s.AttendSalary + s.PerfSalary + s.AwardSalary - s.SocialInsurence - s.PersonalTax - s.HouseFund)
if s.Master == "" {
return butil.FloatCut(s.AttendSalary + s.PerfSalary + s.AwardSalary - s.SocialInsurence - s.PersonalTax - s.HouseFund)
}
return butil.FloatCut(s.BaseSalary)
}
func (s *StaffSalary) GetShouldSalary() float64 {
return butil.FloatCut(s.AttendSalary + s.PerfSalary + s.AwardSalary)
if s.Master == "" {
return butil.FloatCut(s.AttendSalary + s.PerfSalary + s.AwardSalary)
}
return butil.FloatCut(s.BaseSalary)
}
type StaffSalarySort []*StaffSalary

View File

@ -6,6 +6,7 @@ import (
"enterprise/common/config"
"enterprise/common/dao"
"enterprise/common/model"
"enterprise/service"
"fmt"
"github.com/gin-gonic/gin"
log "github.com/sirupsen/logrus"
@ -29,7 +30,7 @@ type StaffSalary struct {
func (s *StaffSalary) History(ctx *gin.Context) {
username := ctx.Query("username")
staffSalarys, err := dao.NewStaffSalaryDao().Query("", username)
staffSalarys, err := dao.NewStaffSalaryDao().Query("", username, nil)
if err != nil {
panic(config.ErrDb.New().Append(err))
}
@ -77,7 +78,7 @@ func (s *StaffSalary) History(ctx *gin.Context) {
func (s *StaffSalary) Agent(month string, ctx *gin.Context) {
xls := ctx.Query("xls")
staffSalarys, err := dao.NewStaffSalaryDao().Query(month, "")
staffSalarys, err := dao.NewStaffSalaryDao().Query(month, "", nil)
if err != nil {
panic(config.ErrDb.New().Append(err))
}
@ -139,7 +140,7 @@ func (s *StaffSalary) Agent(month string, ctx *gin.Context) {
func (s *StaffSalary) Bank(month string, ctx *gin.Context) {
xls := ctx.Query("xls")
staffSalarys, err := dao.NewStaffSalaryDao().Query(month, "")
staffSalarys, err := dao.NewStaffSalaryDao().Query(month, "", nil)
if err != nil {
panic(config.ErrDb.New().Append(err))
}
@ -197,15 +198,18 @@ func (s *StaffSalary) Bank(month string, ctx *gin.Context) {
func (s *StaffSalary) Summary(month string, ctx *gin.Context) {
xls := ctx.Query("xls")
staffSalarys, err := dao.NewStaffSalaryDao().Query(month, "")
masterBank := ""
staffSalarys, err := dao.NewStaffSalaryDao().Query(month, "", &masterBank)
if err != nil {
panic(config.ErrDb.New().Append(err))
}
sort.Sort(model.StaffSalarySort(staffSalarys))
header := []string{"姓名", "身份证号", "入职日期", "转正日期", "基本工资", "绩效工资", "出勤工资", "奖金", "社保扣除", "公积金扣除", "个税扣除", "应出勤天数", "实际出勤天数", "出勤率", "补卡天数", "请假天数", "实发工资", "状态"}
header := []string{"姓名", "身份证号", "入职日期", "转正日期", "基本工资", "绩效工资", "出勤工资", "附属工资", "奖金", "社保扣除", "公积金扣除", "个税扣除", "应出勤天数", "实际出勤天数", "出勤率", "补卡天数", "请假天数", "实发工资", "状态"}
datas := make([][]string, 0)
summary := new(model.StaffSalary)
totalCount := 0
totalSlaveSalary := float64(0)
for _, staff := range staffSalarys {
baseInfo, err := dao.NewStaffInfoDao().GetByUsername(staff.Username)
if err != nil {
@ -225,6 +229,14 @@ func (s *StaffSalary) Summary(month string, ctx *gin.Context) {
item = append(item, cast.ToString(staff.BaseSalary))
item = append(item, cast.ToString(butil.FloatCut(staff.PerfSalary)))
item = append(item, cast.ToString(butil.FloatCut(staff.AttendSalary)))
slaveSalary := float64(0)
info, _ := dao.NewStaffInfoDao().GetByUsername(staff.Username)
if info != nil {
slaveSalary = service.NewStaff(info, nil).GetSlaveSalary(month)
}
item = append(item, cast.ToString(butil.FloatCut(slaveSalary)))
item = append(item, cast.ToString(butil.FloatCut(staff.AwardSalary)))
item = append(item, cast.ToString(staff.SocialInsurence))
item = append(item, cast.ToString(staff.HouseFund))
@ -234,14 +246,15 @@ func (s *StaffSalary) Summary(month string, ctx *gin.Context) {
item = append(item, fmt.Sprintf("%d%%", int(100*staff.RealDay/staff.TotalDay)))
item = append(item, cast.ToString(extra["approvalCheckinDay"]))
item = append(item, cast.ToString(staff.Holiday))
item = append(item, cast.ToString(staff.GetRealSalary()))
item = append(item, cast.ToString(staff.GetRealSalary()+slaveSalary))
if staff.TotalDay != cast.ToFloat64(staff.RealDay)+cast.ToFloat64(staff.Holiday) {
item = append(item, "【异常】")
} else {
item = append(item, "")
}
//item = append(item, fmt.Sprintf("https://e.batiao8.com/staff/salary/history?username=%s", baseInfo.Username))
totalCount += 1
totalSlaveSalary += slaveSalary
datas = append(datas, item)
summary.BaseSalary += staff.BaseSalary
summary.PerfSalary += staff.PerfSalary
@ -260,11 +273,11 @@ func (s *StaffSalary) Summary(month string, ctx *gin.Context) {
summary.SocialInsurence = butil.FloatCut(summary.SocialInsurence)
summary.HouseFund = butil.FloatCut(summary.HouseFund)
summary.PersonalTax = butil.FloatCut(summary.PersonalTax)
datas = append(datas, []string{"合计", "-", "-", "-",
cast.ToString(summary.BaseSalary), cast.ToString(summary.PerfSalary), cast.ToString(summary.AttendSalary), cast.ToString(summary.AwardSalary), cast.ToString(summary.SocialInsurence),
cast.ToString(summary.HouseFund),
datas = append(datas, []string{"合计", cast.ToString(totalCount), "-", "-",
cast.ToString(summary.BaseSalary), cast.ToString(summary.PerfSalary), cast.ToString(summary.AttendSalary), cast.ToString(totalSlaveSalary),
cast.ToString(summary.AwardSalary), cast.ToString(summary.SocialInsurence), cast.ToString(summary.HouseFund),
cast.ToString(summary.PersonalTax), "-", "-", "-", "-", cast.ToString(summary.Holiday),
cast.ToString(butil.FloatCut(summary.GetRealSalary())), "-"})
cast.ToString(butil.FloatCut(summary.GetRealSalary() + totalSlaveSalary)), "-"})
if xls != "" {
filename := fmt.Sprintf("summary_%s.xlsx", time.Now().Format("20060102_150405"))

View File

@ -25,6 +25,34 @@ func NewStaff(info *model.StaffInfo, config *model.StaffConfig) *Staff {
}
}
func (s *Staff) GetSlaveSalary(month string) float64 {
slaveSalarys, err := dao.NewStaffSalaryDao().Query(month, "", &s.info.Username)
if err != nil {
log.Errorf("db error :%s", err.Error())
return 0
}
totalSumSalary := float64(0)
if len(slaveSalarys) != 0 {
for _, slaveSalary := range slaveSalarys {
totalSumSalary += slaveSalary.BaseSalary
}
}
return totalSumSalary
}
func (s *Staff) CalcSlaveSalary(salary *model.StaffSalary, month string) (*model.StaffSalary, error) {
if salary == nil {
salary = new(model.StaffSalary)
salary.Month = month
salary.Username = s.info.Username
}
salary.BaseSalary = cast.ToFloat64(s.info.BaseSalary)
salary.Master = s.info.Master
return salary, nil
}
func (s *Staff) CalcSalary(salary *model.StaffSalary, month string) (*model.StaffSalary, error) {
staff := s.info
if salary == nil {

View File

@ -55,7 +55,8 @@ func (s *Staff) MontorWorkAge() {
}
func (s *Staff) SendStaffSalaryBill(month string) {
staffSalarys, err := dao.NewStaffSalaryDao().Query(month, "")
masterBlank := ""
staffSalarys, err := dao.NewStaffSalaryDao().Query(month, "", &masterBlank)
if err != nil {
log.Errorf("db error :%s", err.Error())
return
@ -76,9 +77,20 @@ func (s *Staff) SendStaffSalaryBill(month string) {
if staffSalary.AwardSalary >= 0.1 {
message = append(message, fmt.Sprintf("额外工资:%.2f", staffSalary.AwardSalary))
}
//附属工资
var slaveSalary float64 = 0
staff, _ := dao.NewStaffInfoDao().GetByUsername(staffSalary.Username)
if staff != nil {
slaveSalary = service.NewStaff(staff, nil).GetSlaveSalary(month)
if slaveSalary > 0.1 {
message = append(message, fmt.Sprintf("附属工资:%.2f", slaveSalary))
}
}
message = append(message, fmt.Sprintf("社保扣除:%.2f", staffSalary.SocialInsurence))
message = append(message, fmt.Sprintf("个税扣除:%.2f", staffSalary.PersonalTax))
message = append(message, fmt.Sprintf("实发工资:%.2f", staffSalary.GetRealSalary()))
message = append(message, fmt.Sprintf("实发工资:%.2f", staffSalary.GetRealSalary()+slaveSalary))
if err := global.SendMessage([]string{"jiangyong"}, strings.Join(message, "\n")); err != nil {
log.Errorf("send message error :%s", err.Error())
@ -165,22 +177,28 @@ func (s *Staff) SyncStaffSalary(month string) {
}
}
config, err := dao.NewUserConfigDao().GetByUsername(staff.Username)
if err != nil || config == nil {
log.Errorf("username[%s] not config,skip!!", staff.Username)
continue
}
salary, err := dao.NewStaffSalaryDao().GetBy(staff.Username, month)
if err != nil {
log.Errorf("db error :%s", err.Error())
continue
}
staffService := service.NewStaff(staff, config)
salary, err = staffService.CalcSalary(salary, month)
if err != nil {
log.Errorf("username[%s] staffService.CalcSalary error :%s", staff.Username, err.Error())
continue
//附属员工直接生成工资单
if staff.Master != "" {
staffService := service.NewStaff(staff, nil)
salary, err = staffService.CalcSlaveSalary(salary, month)
} else {
config, err := dao.NewUserConfigDao().GetByUsername(staff.Username)
if err != nil || config == nil {
log.Errorf("username[%s] not config,skip!!", staff.Username)
continue
}
staffService := service.NewStaff(staff, config)
salary, err = staffService.CalcSalary(salary, month)
if err != nil {
log.Errorf("username[%s] staffService.CalcSalary error :%s", staff.Username, err.Error())
continue
}
}
if salary.Id == 0 {