service/serviceContract.go
@@ -4,11 +4,19 @@
   "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)
   for _, product := range serviceContract.Products {
      serviceContract.AmountReceivable = serviceContract.AmountReceivable.Add(product.Amount.Mul(product.Price))
   }
   serviceContract.AmountReceivable = serviceContract.AmountReceivable.Round(2)
   err := model.NewServiceContractSearch().Create(serviceContract)
   if err != nil {
      return ecode.SContractExist
@@ -19,11 +27,23 @@
func (SContractService) UpdateServiceContract(serviceContract *model.ServiceContract) int {
   // check serviceContract exist
   _, err := model.NewServiceContractSearch().SetId(serviceContract.Id).First()
   old, err := model.NewServiceContractSearch().SetId(serviceContract.Id).First()
   if err != nil {
      return ecode.SContractNotExist
   }
   var amountReceivable decimal.Decimal
   for _, product := range serviceContract.Products {
      amountReceivable = serviceContract.AmountReceivable.Add(product.Amount.Mul(product.Price))
   }
   if amountReceivable.LessThan(serviceContract.AmountInvoiced) {
      return ecode.SContractProductPriceLowerThanInvoiceAmountErr
   }
   if amountReceivable.LessThan(serviceContract.AmountReceived) {
      return ecode.SContractProductPriceLowerThanReceivedAmountErr
   }
   serviceContract.AmountInvoiced = old.AmountReceived
   serviceContract.AmountReceived = old.AmountReceived
   serviceContract.AmountReceivable = amountReceivable.Round(2)
   err = model.NewServiceContractSearch().SetId(serviceContract.Id).Update(serviceContract)
   if err != nil {
      return ecode.SContractSetErr