From 7cc2f77503135e266264eb897e8f688e8ad216d5 Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期三, 09 八月 2023 19:27:38 +0800 Subject: [PATCH] 增加发票和合同产品的关联,发票新增和修改时更改对应合同已开票金额 --- service/invoice.go | 51 +++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 41 insertions(+), 10 deletions(-) diff --git a/service/invoice.go b/service/invoice.go index c70450d..59301a9 100644 --- a/service/invoice.go +++ b/service/invoice.go @@ -18,12 +18,13 @@ func (InvoiceService) AddInvoice(invoice *model.Invoice) int { if invoice.SourceType == constvar.InvoiceSourceTypeServiceContract { - serviceContract, err := model.NewServiceContractSearch().SetId(invoice.SourceId).First() + serviceContract, err := model.NewServiceContractSearch().SetId(invoice.SourceId).SetPreload(true).First() if err != nil { return ecode.DBErr } var amountInvoiced decimal.Decimal - for _, product := range invoice.Products { + rightProducts := NewProductsService().PickRightProducts(invoice.Products, serviceContract.Products) + for _, product := range rightProducts { amountInvoiced = serviceContract.AmountInvoiced.Add(product.Amount.Mul(product.Price)) } amountInvoiced = amountInvoiced.Round(2) @@ -35,13 +36,9 @@ if err != nil { return err } - err = model.NewServiceContractSearch().SetId(invoice.SourceId).UpdateByMap(map[string]interface{}{ + return model.NewServiceContractSearch().SetId(invoice.SourceId).UpdateByMap(map[string]interface{}{ "amount_invoiced": amountInvoiced, }) - if err != nil { - return err - } - return nil }) if err != nil { return ecode.DBErr @@ -86,9 +83,43 @@ } func (InvoiceService) UpdateInvoice(invoice *model.Invoice) int { - err := model.NewInvoiceSearch().SetId(invoice.Id).Save(invoice) - if err != nil { - return ecode.DBErr + if invoice.SourceType == constvar.InvoiceSourceTypeServiceContract { + serviceContract, err := model.NewServiceContractSearch().SetId(invoice.SourceId).SetPreload(true).First() + if err != nil { + return ecode.DBErr + } + var amountInvoiced decimal.Decimal + newProducts, removedProducts := NewProductsService().PickDiffProducts(invoice.Products, serviceContract.Products) + for _, product := range newProducts { + amountInvoiced = serviceContract.AmountInvoiced.Add(product.Amount.Mul(product.Price)) + } + removedProductIds := make([]uint, 0, len(removedProducts)) + for _, product := range removedProducts { + amountInvoiced = serviceContract.AmountInvoiced.Sub(product.Amount.Mul(product.Price)) + removedProductIds = append(removedProductIds, product.Id) + } + amountInvoiced = amountInvoiced.Round(2) + if amountInvoiced.GreaterThan(serviceContract.AmountReceivable) { + return ecode.SContractInvoiceProductPriceGreaterThanReceivableAmountErr + } + err = model.WithTransaction(func(db *gorm.DB) error { + err = model.NewInvoiceSearch().SetId(invoice.Id).Save(invoice) + if err != nil { + return err + } + if len(removedProductIds) > 0 { + err = model.NewInvoiceProductSearch().SetInvoiceId(invoice.Id).SetProductIds(removedProductIds).Delete() + if err != nil { + return err + } + } + return model.NewServiceContractSearch().SetId(invoice.SourceId).UpdateByMap(map[string]interface{}{ + "amount_invoiced": amountInvoiced, + }) + }) + if err != nil { + return ecode.DBErr + } } return ecode.OK } -- Gitblit v1.8.0