package service import ( "aps_crm/constvar" "aps_crm/model" "aps_crm/pkg/ecode" "github.com/shopspring/decimal" ) type SContractService struct{} func (SContractService) AddServiceContract(serviceContract *model.ServiceContract) int { serviceContract.AmountReceivable = decimal.Zero.Round(2) serviceContract.AmountInvoiced = decimal.Zero.Round(2) serviceContract.AmountReceived = decimal.Zero.Round(2) serviceContract.AmountUnInvoiced = decimal.Zero.Round(2) serviceContract.AmountTotal = decimal.Zero.Round(2) for _, product := range serviceContract.Products { serviceContract.AmountTotal = serviceContract.AmountTotal.Add(product.Amount.Mul(product.Price)) } serviceContract.AmountTotal = serviceContract.AmountTotal.Round(2) serviceContract.AmountReceivable = serviceContract.AmountTotal serviceContract.AmountUnInvoiced = serviceContract.AmountTotal err := model.NewServiceContractSearch().Create(serviceContract) if err != nil { return ecode.SContractExist } return ecode.OK } func (SContractService) UpdateServiceContract(serviceContract *model.ServiceContract) int { // check serviceContract exist old, err := model.NewServiceContractSearch().SetId(serviceContract.Id).First() if err != nil { return ecode.SContractNotExist } var totalAmount decimal.Decimal totalAmount = serviceContract.AmountTotal newProducts, removedProducts := NewProductsService().PickDiffProducts(serviceContract.Products, old.Products) for _, product := range newProducts { totalAmount = totalAmount.Add(product.Amount.Mul(product.Price)) } removedProductIds := make([]uint, 0, len(removedProducts)) for _, product := range removedProducts { totalAmount = totalAmount.Sub(product.Amount.Mul(product.Price)) removedProductIds = append(removedProductIds, product.Id) } serviceContract.AmountTotal = totalAmount.Round(2) serviceContract.AmountReceivable = serviceContract.AmountTotal.Sub(serviceContract.AmountReceived) serviceContract.AmountUnInvoiced = serviceContract.AmountTotal.Sub(serviceContract.AmountInvoiced) err = model.NewServiceContractSearch().SetId(serviceContract.Id).Update(serviceContract) if err != nil { return ecode.SContractSetErr } return ecode.OK } //func (SContractService) GetServiceContractByContractId(contractId int) ([]*model.ServiceContract, int) { // list, err := model.NewServiceContractSearch().SetId(contractId).FindAll() // if err != nil { // return nil, ecode.SContractListErr // } // // return list, ecode.OK //} func (SContractService) DeleteServiceContract(ids []int) int { // delete client err := model.NewServiceContractSearch().SetIds(ids).Delete() if err != nil { return ecode.SContractDeleteErr } return ecode.OK } func (SContractService) BatchDeleteServiceContract(ids []int) int { err := model.NewServiceContractSearch().DeleteByIds(ids) if err != nil { return ecode.DBErr } return ecode.OK } func (SContractService) GetServiceContractList(page, pageSize int, queryClass constvar.ServiceContractQueryClass, keywordType constvar.ServiceContractKeywordType, keyword string) ([]*model.ServiceContract, int64, int) { // get contact list contacts, total, err := model.NewServiceContractSearch(). SetKeyword(keyword). SetKeywordType(keywordType). SetQueryClass(queryClass). SetPage(page, pageSize). SetPreload(true). Find() if err != nil { return nil, 0, ecode.SContractListErr } return contacts, total, ecode.OK }