Ejemplo n.º 1
0
        public void PurchaseReturnRecordAdd(PurchasePaymentReturnRecordModel model)
        {
            var net = model.CurrentReturnAmount - model.PrevReturnAmount;

            if (net == 0)
            {
                return;
            }

            var returnRecord = _mapper.Map <PurchasePaymentReturnRecord>(model);

            Context.PurchasePaymentReturnRecord.Add(returnRecord);

            if (model.AccountId != null)
            {
                BalanceAdd(model.AccountId.Value, net);
            }

            Context.SaveChanges();
        }
Ejemplo n.º 2
0
        public async Task <DbResponse <int> > BillUpdated(PurchaseUpdatePostModel model, IUnitOfWork db, string userName)
        {
            var response = new DbResponse <int>();

            try
            {
                var purchase = Context.Purchase
                               .Include(s => s.PurchaseList)
                               .FirstOrDefault(s => s.PurchaseId == model.PurchaseId);

                if (purchase == null)
                {
                    response.IsSuccess = false;
                    response.Message   = "Not found";
                    return(response);
                }
                var registrationId = db.Registrations.GetRegID_ByUserName(userName);
                var returnRecord   = new PurchasePaymentReturnRecordModel
                {
                    PrevReturnAmount    = decimal.Round(purchase.PurchaseReturnAmount, 2),
                    CurrentReturnAmount = decimal.Round(model.PurchaseReturnAmount, 2),
                    AccountId           = model.AccountId,
                    PurchaseId          = purchase.PurchaseId,
                    RegistrationId      = registrationId
                };

                purchase.PurchaseTotalPrice     = decimal.Round(model.PurchaseTotalPrice, 2);
                purchase.PurchaseDiscountAmount = decimal.Round(model.PurchaseDiscountAmount, 2);
                purchase.PurchaseReturnAmount   = decimal.Round(model.PurchaseReturnAmount, 2);
                purchase.PurchasePaidAmount    += decimal.Round(model.PaidAmount, 2);


                var due = (purchase.PurchaseTotalPrice + purchase.PurchaseReturnAmount) - (purchase.PurchaseDiscountAmount + purchase.PurchasePaidAmount);
                if (due < 0)
                {
                    response.IsSuccess = false;
                    response.Message   = "Due cannot be less than zero";
                    return(response);
                }

                if (model.RemovedProductStockIds != null)
                {
                    if (model.RemovedProductStockIds.Any())
                    {
                        var removedStocks = Context.ProductStock
                                            .Include(s => s.ProductLog)
                                            .Include(s => s.Warranty)
                                            .Where(s => model.RemovedProductStockIds.Contains(s.ProductStockId)).ToList();

                        if (removedStocks.Any(s => s.IsSold))
                        {
                            response.IsSuccess = false;
                            response.Message   = "Sold product can not be return";
                            return(response);
                        }

                        if (removedStocks.Any())
                        {
                            Context.ProductStock.RemoveRange(removedStocks);
                        }
                    }
                }


                if (model.PurchaseList == null)
                {
                    purchase.PurchaseList = null;
                }

                Context.Purchase.Update(purchase);

                var existProduct = model.PurchaseList.Where(p => p.PurchaseListId != 0 && p.AddedProductCodes != null).ToList();


                foreach (var pItem in existProduct)
                {
                    var purchaseList = Context.PurchaseList.Find(pItem.PurchaseListId);

                    purchaseList.SellingPrice  = pItem.SellingPrice;
                    purchaseList.PurchasePrice = pItem.PurchasePrice;
                    purchaseList.Description   = pItem.Description;
                    purchaseList.Note          = pItem.Note;
                    purchaseList.Warranty      = pItem.Warranty;
                    purchaseList.ProductStock  = pItem.AddedProductCodes.Select(s => new ProductStock
                    {
                        ProductId   = pItem.ProductId,
                        ProductCode = s
                    }).ToList();

                    Context.PurchaseList.Update(purchaseList);
                }

                var newProduct = model.PurchaseList.Where(p => p.PurchaseListId == 0 && p.AddedProductCodes != null).ToList();

                var newPurchaseList = newProduct.Select(p => new PurchaseList
                {
                    PurchaseListId = p.PurchaseListId,
                    PurchaseId     = model.PurchaseId,
                    ProductId      = p.ProductId,
                    SellingPrice   = p.SellingPrice,
                    PurchasePrice  = p.PurchasePrice,
                    Description    = p.Description,
                    Note           = p.Note,
                    Warranty       = p.Warranty,
                    ProductStock   = p.AddedProductCodes.Select(s => new ProductStock
                    {
                        ProductId   = p.ProductId,
                        ProductCode = s
                    }).ToList()
                }).ToList();

                Context.PurchaseList.AddRange(newPurchaseList);



                if (model.PaidAmount > 0)
                {
                    var newSellingPaymentSn = await db.PurchasePayments.GetNewSnAsync().ConfigureAwait(false);

                    var payment = new PurchasePayment
                    {
                        RegistrationId      = registrationId,
                        VendorId            = purchase.VendorId,
                        ReceiptSn           = newSellingPaymentSn,
                        PaidAmount          = model.PaidAmount,
                        AccountId           = model.AccountId,
                        PaidDate            = DateTime.Now.BdTime().Date,
                        PurchasePaymentList = new List <PurchasePaymentList>
                        {
                            new PurchasePaymentList
                            {
                                PurchasePaidAmount = model.PaidAmount,
                                PurchaseId         = model.PurchaseId
                            }
                        }
                    };

                    await Context.PurchasePayment.AddAsync(payment);
                }

                //Account add balance
                if (model.PaidAmount > 0 && model.AccountId != null)
                {
                    db.Account.BalanceSubtract(model.AccountId.Value, model.PaidAmount);
                }


                await Context.SaveChangesAsync();

                db.Vendors.UpdatePaidDue(purchase.VendorId);

                //remove purchase list
                var removedPurchaseList = Context.PurchaseList.Where(l => !l.ProductStock.Any()).ToList();

                Context.RemoveRange(removedPurchaseList);
                await Context.SaveChangesAsync();

                //Product Logs
                var codes     = model.PurchaseList.SelectMany(l => l.AddedProductCodes).ToArray();
                var stockList = Context
                                .ProductStock
                                .Include(p => p.PurchaseList)
                                .Where(s => s.PurchaseList.PurchaseId == model.PurchaseId && codes.Contains(s.ProductCode))
                                .ToList();

                if (stockList.Any())
                {
                    var productLogs = stockList.Select(c => new ProductLogAddModel
                    {
                        PurchaseId               = model.PurchaseId,
                        ProductStockId           = c.ProductStockId,
                        ActivityByRegistrationId = registrationId,
                        Details   = $"Bill Updated: Product Buy at Receipt No: {purchase.PurchaseSn}",
                        LogStatus = ProductLogStatus.PurchaseUpdate
                    }).ToList();
                    //Product log
                    db.ProductLog.AddList(productLogs);
                }

                //Return amount account update
                db.Account.PurchaseReturnRecordAdd(returnRecord);
            }
            catch (Exception e)
            {
                response.IsSuccess = false;
                response.Message   = e.Message;
                return(response);
            }

            response.IsSuccess = true;
            response.Message   = "Success";
            response.Data      = model.PurchaseId;

            return(response);
        }