public async Task <int> Create(UnitPaymentCorrectionNote m, string user, int clientTimeZoneOffset = 7)
        {
            int Created = 0;

            using (var transaction = this.dbContext.Database.BeginTransaction())
            {
                try
                {
                    EntityExtension.FlagForCreate(m, user, USER_AGENT);
                    var supplier       = GetSupplier(m.SupplierId);
                    var supplierImport = false;
                    m.SupplierNpwp = null;
                    if (supplier != null)
                    {
                        m.SupplierNpwp = supplier.npwp;
                        supplierImport = supplier.import;
                    }
                    m.UPCNo = await GenerateNo(m, clientTimeZoneOffset, supplierImport, m.DivisionName);

                    if (m.useVat == true)
                    {
                        m.ReturNoteNo = await GeneratePONo(m, clientTimeZoneOffset);
                    }
                    UnitPaymentOrder unitPaymentOrder = this.dbContext.UnitPaymentOrders.Where(s => s.Id == m.UPOId).Include(p => p.Items).ThenInclude(i => i.Details).FirstOrDefault();
                    unitPaymentOrder.IsCorrection = true;

                    foreach (var item in m.Items)
                    {
                        EntityExtension.FlagForCreate(item, user, USER_AGENT);
                        foreach (var itemSpb in unitPaymentOrder.Items)
                        {
                            foreach (var detailSpb in itemSpb.Details)
                            {
                                if (item.UPODetailId == detailSpb.Id)
                                {
                                    detailSpb.QuantityCorrection = detailSpb.QuantityCorrection - item.Quantity;
                                    ExternalPurchaseOrderDetail epoDetail = dbContext.ExternalPurchaseOrderDetails.FirstOrDefault(a => a.Id.Equals(detailSpb.EPODetailId));
                                    epoDetail.DOQuantity -= item.Quantity;
                                }
                            }
                        }
                    }

                    this.dbSet.Add(m);
                    Created = await dbContext.SaveChangesAsync();

                    Created += await AddCorrections(m, user);

                    transaction.Commit();
                }
                catch (Exception e)
                {
                    transaction.Rollback();
                    throw new Exception(e.Message);
                }
            }

            return(Created);
        }
        private void SetPOItemIdEPONo(UnitPaymentOrderDetail detail)
        {
            ExternalPurchaseOrderDetail EPODetail = dbContext.ExternalPurchaseOrderDetails.Single(m => m.Id == detail.EPODetailId);

            detail.POItemId = EPODetail.POItemId;

            detail.EPONo = dbContext.ExternalPurchaseOrders.Single(m => m.Items.Any(i => i.Id == EPODetail.EPOItemId)).EPONo;
        }
        public async Task <int> Create(DeliveryOrder model, string username)
        {
            int Created = 0;

            using (var transaction = this.dbContext.Database.BeginTransaction())
            {
                try
                {
                    EntityExtension.FlagForCreate(model, username, USER_AGENT);

                    foreach (var item in model.Items)
                    {
                        EntityExtension.FlagForCreate(item, username, USER_AGENT);

                        foreach (var detail in item.Details)
                        {
                            EntityExtension.FlagForCreate(detail, username, USER_AGENT);

                            ExternalPurchaseOrderDetail externalPurchaseOrderDetail = this.dbContext.ExternalPurchaseOrderDetails.SingleOrDefault(m => m.Id == detail.EPODetailId);

                            if (externalPurchaseOrderDetail != null)
                            {
                                externalPurchaseOrderDetail.DOQuantity += detail.DOQuantity;
                                EntityExtension.FlagForUpdate(externalPurchaseOrderDetail, username, USER_AGENT);
                                SetStatus(externalPurchaseOrderDetail, detail, username);
                            }
                        }
                    }

                    this.dbSet.Add(model);
                    Created = await dbContext.SaveChangesAsync();

                    Created += await AddFulfillmentAsync(model, username);

                    transaction.Commit();
                }
                catch (Exception e)
                {
                    transaction.Rollback();
                    while (e.InnerException != null)
                    {
                        e = e.InnerException;
                    }
                    throw e;
                }
            }

            return(Created);
        }
 public POExternalItemDto(ExternalPurchaseOrderDetail element, ExternalPurchaseOrder entity)
 {
     Product         = new ProductDto(element.ProductCode, element.ProductId, element.ProductName, element.DefaultUomId, element.DefaultUomUnit);
     DefaultQuantity = element.DefaultQuantity;
     DealQuantity    = element.DealQuantity;
     DealUOM         = new UOMDto(element.DealUomId, element.DealUomUnit);
     Conversion      = element.Conversion;
     Price           = element.PricePerDealUnit;
     UseVat          = entity.UseVat;
     Unit            = new UnitDto(entity.UnitId, entity.UnitCode, entity.UnitName, entity.DivisionCode, entity.DivisionId, entity.DivisionName);
     IncomeTax       = new IncomeTaxDto(entity.IncomeTaxId, entity.IncomeTaxName, entity.IncomeTaxRate);
     IncomeTaxBy     = entity.IncomeTaxBy;
     UseIncomeTax    = entity.UseIncomeTax;
     EPOId           = (int)entity.Id;
 }
        public async Task <int> Create(PurchasingDisposition m, string user, int clientTimeZoneOffset)
        {
            int Created = 0;

            using (var transaction = this.dbContext.Database.BeginTransaction())
            {
                try
                {
                    EntityExtension.FlagForCreate(m, user, "Facade");
                    m.DispositionNo = await GenerateNo(m, clientTimeZoneOffset);

                    m.Position = 1;
                    if (m.IncomeTaxBy == "Supplier")
                    {
                        m.Amount = m.DPP + m.VatValue + m.PaymentCorrection;
                    }
                    else
                    {
                        m.Amount = m.DPP + m.VatValue - m.IncomeTaxValue + m.PaymentCorrection;
                    }

                    foreach (var item in m.Items)
                    {
                        EntityExtension.FlagForCreate(item, user, "Facade");
                        foreach (var detail in item.Details)
                        {
                            ExternalPurchaseOrderDetail epoDetail = this.dbContext.ExternalPurchaseOrderDetails.Where(s => s.Id.ToString() == detail.EPODetailId && s.IsDeleted == false).FirstOrDefault();
                            epoDetail.DispositionQuantity += detail.PaidQuantity;
                            EntityExtension.FlagForCreate(detail, user, "Facade");
                        }
                    }

                    this.dbSet.Add(m);
                    Created = await dbContext.SaveChangesAsync();

                    transaction.Commit();
                }
                catch (Exception e)
                {
                    transaction.Rollback();
                    throw new Exception(e.Message);
                }
            }

            return(Created);
        }
        public int Delete(int id, string username)
        {
            int Deleted = 0;

            using (var transaction = this.dbContext.Database.BeginTransaction())
            {
                try
                {
                    var model = this.dbSet
                                .Include(d => d.Items)
                                .ThenInclude(d => d.Details)
                                .SingleOrDefault(pr => pr.Id == id && !pr.IsDeleted);

                    EntityExtension.FlagForDelete(model, username, USER_AGENT);

                    foreach (var item in model.Items)
                    {
                        EntityExtension.FlagForDelete(item, username, USER_AGENT);
                        foreach (var detail in item.Details)
                        {
                            ExternalPurchaseOrderDetail externalPurchaseOrderDetail = this.dbContext.ExternalPurchaseOrderDetails.SingleOrDefault(m => m.Id == detail.EPODetailId);
                            externalPurchaseOrderDetail.DOQuantity -= detail.DOQuantity;
                            EntityExtension.FlagForUpdate(externalPurchaseOrderDetail, username, USER_AGENT);
                            SetStatus(externalPurchaseOrderDetail, detail, username);

                            EntityExtension.FlagForDelete(detail, username, USER_AGENT);
                        }
                    }

                    Deleted  = dbContext.SaveChanges();
                    Deleted += RemoveFulfillment(model, username);
                    transaction.Commit();
                }
                catch (Exception e)
                {
                    transaction.Rollback();
                    while (e.InnerException != null)
                    {
                        e = e.InnerException;
                    }
                    throw e;
                }
            }

            return(Deleted);
        }
        private void SetStatus(UnitPaymentOrderDetail detail, string username)
        {
            ExternalPurchaseOrderDetail EPODetail = dbContext.ExternalPurchaseOrderDetails.Single(m => m.Id == detail.EPODetailId);
            InternalPurchaseOrderItem   POItem    = dbContext.InternalPurchaseOrderItems.Single(m => m.Id == EPODetail.POItemId);

            List <long> EPODetailIds = dbContext.ExternalPurchaseOrderDetails.Where(m => m.POItemId == POItem.Id).Select(m => m.Id).ToList();
            List <long> URNItemIds   = dbContext.UnitReceiptNoteItems.Where(m => EPODetailIds.Contains(m.EPODetailId)).Select(m => m.Id).ToList();

            var totalReceiptQuantity = dbContext.UnitPaymentOrderDetails.AsNoTracking().Where(m => m.IsDeleted == false && URNItemIds.Contains(m.URNItemId)).Sum(m => m.ReceiptQuantity);

            if (totalReceiptQuantity > 0)
            {
                if (totalReceiptQuantity < EPODetail.DealQuantity)
                {
                    POItem.Status = "Sudah dibuat SPB sebagian";
                }
                else
                {
                    POItem.Status = "Sudah dibuat SPB semua";
                }
            }
            else if (totalReceiptQuantity == 0)
            {
                if (EPODetail.DOQuantity >= EPODetail.DealQuantity)
                {
                    if (EPODetail.ReceiptQuantity < EPODetail.DealQuantity)
                    {
                        POItem.Status = "Barang sudah diterima Unit parsial";
                    }
                    else
                    {
                        POItem.Status = "Barang sudah diterima Unit semua";
                    }
                }
                else
                {
                    POItem.Status = "Barang sudah diterima Unit parsial";
                }
            }
            EntityExtension.FlagForUpdate(POItem, username, USER_AGENT);
        }
        public int Delete(int id, string user)
        {
            int Deleted = 0;

            using (var transaction = this.dbContext.Database.BeginTransaction())
            {
                try
                {
                    var m = this.dbSet
                            .Include(d => d.Items)
                            .ThenInclude(d => d.Details)
                            .SingleOrDefault(epo => epo.Id == id && !epo.IsDeleted);

                    EntityExtension.FlagForDelete(m, user, "Facade");

                    foreach (var item in m.Items)
                    {
                        EntityExtension.FlagForDelete(item, user, "Facade");
                        foreach (var detail in item.Details)
                        {
                            ExternalPurchaseOrderDetail epoDetail = this.dbContext.ExternalPurchaseOrderDetails.Where(s => s.Id.ToString() == detail.EPODetailId && s.IsDeleted == false).FirstOrDefault();
                            epoDetail.DispositionQuantity -= detail.PaidQuantity;
                            EntityExtension.FlagForDelete(detail, user, "Facade");
                        }
                    }

                    Deleted = dbContext.SaveChanges();
                    transaction.Commit();
                }
                catch (Exception e)
                {
                    transaction.Rollback();
                    throw new Exception(e.Message);
                }
            }

            return(Deleted);
        }
        private void SetStatus(ExternalPurchaseOrderDetail externalPurchaseOrderDetail, DeliveryOrderDetail detail, string username)
        {
            if (externalPurchaseOrderDetail.ReceiptQuantity == 0)
            {
                if (dbContext.UnitPaymentOrderDetails.FirstOrDefault(d => d.POItemId == externalPurchaseOrderDetail.POItemId) == null)
                {
                    //PurchaseRequestItem purchaseRequestItem = this.dbContext.PurchaseRequestItems.SingleOrDefault(i => i.Id == detail.PRItemId);
                    InternalPurchaseOrderItem internalPurchaseOrderItem = this.dbContext.InternalPurchaseOrderItems.SingleOrDefault(i => i.Id == detail.POItemId);

                    if (externalPurchaseOrderDetail.DOQuantity == 0)
                    {
                        //purchaseRequestItem.Status = "Sudah diorder ke Supplier";
                        internalPurchaseOrderItem.Status = "Sudah diorder ke Supplier";

                        //EntityExtension.FlagForUpdate(purchaseRequestItem, username, USER_AGENT);
                        EntityExtension.FlagForUpdate(internalPurchaseOrderItem, username, USER_AGENT);
                    }
                    else if (externalPurchaseOrderDetail.DOQuantity > 0 && externalPurchaseOrderDetail.DOQuantity < externalPurchaseOrderDetail.DealQuantity)
                    {
                        //purchaseRequestItem.Status = "Barang sudah datang parsial";
                        internalPurchaseOrderItem.Status = "Barang sudah datang parsial";

                        //EntityExtension.FlagForUpdate(purchaseRequestItem, username, USER_AGENT);
                        EntityExtension.FlagForUpdate(internalPurchaseOrderItem, username, USER_AGENT);
                    }
                    else if (externalPurchaseOrderDetail.DOQuantity > 0 && externalPurchaseOrderDetail.DOQuantity >= externalPurchaseOrderDetail.DealQuantity)
                    {
                        //purchaseRequestItem.Status = "Barang sudah datang semua";
                        internalPurchaseOrderItem.Status = "Barang sudah datang semua";

                        //EntityExtension.FlagForUpdate(purchaseRequestItem, username, USER_AGENT);
                        EntityExtension.FlagForUpdate(internalPurchaseOrderItem, username, USER_AGENT);
                    }
                }
            }
        }
        public async Task <PurchasingDisposition> GetNewData()
        {
            var s = await Task.Run(() => externalPurchaseOrderDataUtil.GetTestData("unit-test"));

            ExternalPurchaseOrderDetail d = new ExternalPurchaseOrderDetail();
            ExternalPurchaseOrderItem   i = new ExternalPurchaseOrderItem();
            var itemData = s.Items;

            foreach (var item in itemData)
            {
                i = item; break;
            }
            foreach (var detail in i.Details)
            {
                d = detail; break;
            }

            EPODetailViewModel detailEPO = new EPODetailViewModel
            {
                _id      = d.Id,
                poItemId = d.POItemId,
                prItemId = d.PRItemId,
                product  = new ProductViewModel
                {
                    _id  = d.ProductId,
                    code = d.ProductCode,
                    name = d.ProductName,
                },

                dealQuantity = d.DealQuantity,
                dealUom      = new UomViewModel
                {
                    _id  = d.DealUomId,
                    unit = d.DealUomUnit,
                },
                doQuantity          = d.DOQuantity,
                dispositionQuantity = d.DispositionQuantity,
                productRemark       = d.ProductRemark,
                priceBeforeTax      = d.PriceBeforeTax,
                pricePerDealUnit    = d.PricePerDealUnit,
            };

            EPOItemViewModel itemEPO = new EPOItemViewModel
            {
                _id       = i.Id,
                IsDeleted = i.IsDeleted,
                prId      = i.PRId,
                poId      = i.POId,
                prNo      = i.PRNo,
                category  = new CategoryViewModel
                {
                    _id  = "CategoryId",
                    code = "CategoryCode",
                    name = "CategoryName"
                },
                details = new List <EPODetailViewModel>()
                {
                    detailEPO
                }
            };

            EPOViewModel dataEPO = new EPOViewModel
            {
                _id  = s.Id,
                no   = s.EPONo,
                unit = new UnitViewModel
                {
                    _id  = s.UnitId,
                    name = s.UnitName,
                    code = s.UnitCode,
                },
                useVat       = s.UseVat,
                useIncomeTax = s.UseIncomeTax,
                incomeTax    = new IncomeTaxViewModel
                {
                    _id  = s.IncomeTaxId,
                    name = s.IncomeTaxName,
                    rate = s.IncomeTaxRate,
                },
                items = new List <EPOItemViewModel>()
                {
                    itemEPO
                }
            };


            return(new PurchasingDisposition
            {
                SupplierId = "1",
                SupplierCode = "Supplier1",
                SupplierName = "supplier1",

                Bank = "Bank",
                Amount = 1000,
                Calculation = "axb+c",
                //InvoiceNo="test",
                ConfirmationOrderNo = "test",
                //Investation = "test",

                PaymentDueDate = new DateTimeOffset(),
                ProformaNo = "aaa",
                PaymentMethod = "Test",

                Remark = "Remark1",
                CategoryCode = "test",
                CategoryId = "1",
                CategoryName = "test",


                Items = new List <PurchasingDispositionItem>
                {
                    new PurchasingDispositionItem
                    {
                        EPOId = dataEPO._id.ToString(),
                        EPONo = dataEPO.no,
                        IncomeTaxId = "1",
                        IncomeTaxName = "tax",
                        IncomeTaxRate = 1,
                        UseIncomeTax = true,
                        UseVat = true,
                        Details = new List <PurchasingDispositionDetail>
                        {
                            new PurchasingDispositionDetail
                            {
                                EPODetailId = detailEPO._id.ToString(),

                                DealQuantity = 10,
                                PaidQuantity = 1000,
                                DealUomId = "1",
                                DealUomUnit = "test",
                                PaidPrice = 1000,
                                PricePerDealUnit = 100,
                                PriceTotal = 10000,
                                PRId = "1",
                                PRNo = "test",
                                ProductCode = "test",
                                ProductName = "test",
                                ProductId = "1",
                                UnitName = "test",
                                UnitCode = "test",
                                UnitId = "1",
                            }
                        }
                    }
                }
            });
        }
        public async Task <int> Update(int id, PurchasingDisposition purchasingDisposition, string user)
        {
            int Updated = 0;

            using (var transaction = this.dbContext.Database.BeginTransaction())
            {
                try
                {
                    var existingModel = this.dbSet.AsNoTracking()
                                        .Include(d => d.Items)
                                        .ThenInclude(d => d.Details)
                                        .Single(epo => epo.Id == id && !epo.IsDeleted);

                    foreach (var oldIem in existingModel.Items)
                    {
                        foreach (var oldDetail in oldIem.Details)
                        {
                            ExternalPurchaseOrderDetail epoDetail = this.dbContext.ExternalPurchaseOrderDetails.Where(s => s.Id.ToString() == oldDetail.EPODetailId && s.IsDeleted == false).FirstOrDefault();
                            epoDetail.DispositionQuantity -= oldDetail.PaidQuantity;
                        }
                    }

                    if (existingModel != null && id == purchasingDisposition.Id)
                    {
                        if (purchasingDisposition.IncomeTaxBy == "Supplier")
                        {
                            purchasingDisposition.Amount = purchasingDisposition.DPP + purchasingDisposition.VatValue + purchasingDisposition.PaymentCorrection;
                        }
                        else
                        {
                            purchasingDisposition.Amount = purchasingDisposition.DPP + purchasingDisposition.VatValue - purchasingDisposition.IncomeTaxValue + purchasingDisposition.PaymentCorrection;
                        }

                        EntityExtension.FlagForUpdate(purchasingDisposition, user, "Facade");

                        foreach (var item in purchasingDisposition.Items.ToList())
                        {
                            var existingItem = existingModel.Items.SingleOrDefault(m => m.Id == item.Id);
                            List <PurchasingDispositionItem> duplicateDispositionItems = purchasingDisposition.Items.Where(i => i.EPOId == item.EPOId && i.Id != item.Id).ToList();

                            if (item.Id == 0)
                            {
                                if (duplicateDispositionItems.Count <= 0)
                                {
                                    EntityExtension.FlagForCreate(item, user, "Facade");

                                    foreach (var detail in item.Details)
                                    {
                                        ExternalPurchaseOrderDetail epoDetail = this.dbContext.ExternalPurchaseOrderDetails.Where(s => s.Id.ToString() == detail.EPODetailId && s.IsDeleted == false).FirstOrDefault();
                                        epoDetail.DispositionQuantity += detail.PaidQuantity;
                                        EntityExtension.FlagForCreate(detail, user, "Facade");
                                    }
                                }
                            }
                            else
                            {
                                EntityExtension.FlagForUpdate(item, user, "Facade");

                                if (duplicateDispositionItems.Count > 0)
                                {
                                    //foreach (var detail in item.Details.ToList())
                                    //{
                                    //    if (detail.Id != 0)
                                    //    {

                                    //        EntityExtension.FlagForUpdate(detail, user, "Facade");

                                    //        foreach (var duplicateItem in duplicateDispositionItems.ToList())
                                    //        {
                                    //            foreach (var duplicateDetail in duplicateItem.Details.ToList())
                                    //            {
                                    //                if (item.Details.Count(d => d.EPODetailId.Equals(duplicateDetail.EPODetailId)) < 1)
                                    //                {
                                    //                    ExternalPurchaseOrderDetail epoDetail = this.dbContext.ExternalPurchaseOrderDetails.Where(s => s.Id == detail.EPODetailId && s.IsDeleted == false).FirstOrDefault();
                                    //                    epoDetail.DispositionQuantity += detail.PaidQuantity;
                                    //                    EntityExtension.FlagForCreate(duplicateDetail, user, "Facade");
                                    //                    item.Details.Add(duplicateDetail);

                                    //                }
                                    //            }
                                    //            purchasingDisposition.Items.Remove(duplicateItem);
                                    //        }
                                    //    }
                                    //}
                                }
                                else
                                {
                                    foreach (var detail in item.Details)
                                    {
                                        if (detail.Id != 0)
                                        {
                                            ExternalPurchaseOrderDetail epoDetail = this.dbContext.ExternalPurchaseOrderDetails.Where(s => s.Id.ToString() == detail.EPODetailId && s.IsDeleted == false).FirstOrDefault();
                                            epoDetail.DispositionQuantity += detail.PaidQuantity;
                                            EntityExtension.FlagForUpdate(detail, user, "Facade");
                                        }
                                    }
                                }
                            }
                        }

                        this.dbContext.Update(purchasingDisposition);

                        foreach (var existingItem in existingModel.Items)
                        {
                            var newItem = purchasingDisposition.Items.FirstOrDefault(i => i.Id == existingItem.Id);
                            if (newItem == null)
                            {
                                EntityExtension.FlagForDelete(existingItem, user, "Facade");

                                this.dbContext.PurchasingDispositionItems.Update(existingItem);
                                foreach (var existingDetail in existingItem.Details)
                                {
                                    EntityExtension.FlagForDelete(existingDetail, user, "Facade");

                                    this.dbContext.PurchasingDispositionDetails.Update(existingDetail);
                                }
                            }
                            else
                            {
                                foreach (var existingDetail in existingItem.Details)
                                {
                                    var newDetail = newItem.Details.FirstOrDefault(d => d.Id == existingDetail.Id);
                                    if (newDetail == null)
                                    {
                                        EntityExtension.FlagForDelete(existingDetail, user, "Facade");

                                        this.dbContext.PurchasingDispositionDetails.Update(existingDetail);
                                    }
                                }
                            }
                        }

                        Updated = await dbContext.SaveChangesAsync();

                        transaction.Commit();
                    }
                    else
                    {
                        throw new Exception("Error");
                    }
                }
                catch (Exception e)
                {
                    transaction.Rollback();
                    throw new Exception(e.Message);
                }
            }

            return(Updated);
        }
Exemple #12
0
        public async Task Should_Success_Update_Data()
        {
            ExternalPurchaseOrder model = await DataUtil.GetTestData("Unit test");

            model.UseIncomeTax = false;
            foreach (var item in model.Items)
            {
                foreach (var detail in item.Details)
                {
                    detail.DealQuantity -= 1;
                }
            }
            var Response = await Facade.Update((int)model.Id, model, "Unit test");

            Assert.NotEqual(Response, 0);


            ExternalPurchaseOrderItem   oldItem          = model.Items.FirstOrDefault();
            ExternalPurchaseOrderDetail oldDetail        = oldItem.Details.FirstOrDefault();
            ExternalPurchaseOrderItem   newDuplicateItem = new ExternalPurchaseOrderItem
            {
                POId     = oldItem.POId,
                PONo     = oldItem.PONo,
                PRId     = oldItem.PRId,
                PRNo     = oldItem.PRNo,
                UnitId   = oldItem.UnitId,
                UnitCode = oldItem.UnitCode,
                UnitName = oldItem.UnitName,
                Details  = new List <ExternalPurchaseOrderDetail>()
            };
            ExternalPurchaseOrderDetail oldDuplicateDetail = new ExternalPurchaseOrderDetail
            {
                PRItemId        = oldDetail.PRItemId,
                ProductId       = oldDetail.ProductId,
                ProductCode     = oldDetail.ProductCode,
                ProductName     = oldDetail.ProductName,
                ProductRemark   = oldDetail.ProductRemark,
                DOQuantity      = oldDetail.DOQuantity,
                DealQuantity    = oldDetail.DealQuantity,
                DealUomId       = oldDetail.DealUomId,
                DealUomUnit     = oldDetail.DealUomUnit,
                ReceiptQuantity = oldDetail.ReceiptQuantity,
                DefaultUomId    = oldDetail.DefaultUomId,
                DefaultUomUnit  = oldDetail.DefaultUomUnit,
                POItemId        = oldDetail.POItemId
            };
            ExternalPurchaseOrderDetail newDuplicateDetail = new ExternalPurchaseOrderDetail
            {
                PRItemId        = oldDetail.PRItemId,
                ProductRemark   = oldDetail.ProductRemark,
                DOQuantity      = oldDetail.DOQuantity,
                DealQuantity    = oldDetail.DealQuantity,
                DealUomId       = oldDetail.DealUomId,
                DealUomUnit     = oldDetail.DealUomUnit,
                ReceiptQuantity = oldDetail.ReceiptQuantity,
                DefaultUomId    = oldDetail.DefaultUomId,
                DefaultUomUnit  = oldDetail.DefaultUomUnit,
                POItemId        = oldDetail.POItemId,
                ProductId       = "PrdId2",
                ProductCode     = "PrdCode2",
                ProductName     = "PrdName2",
            };

            newDuplicateItem.Details.Add(oldDuplicateDetail);
            newDuplicateItem.Details.Add(newDuplicateDetail);
            model.Items.Add(newDuplicateItem);
            var ResponseAddDuplicateItem = await Facade.Update((int)model.Id, model, "Unit test");

            Assert.NotEqual(ResponseAddDuplicateItem, 0);

            var newModelForAddItem = await DataUtil.GetNewData("Unit test");

            ExternalPurchaseOrderItem newModelItem = newModelForAddItem.Items.FirstOrDefault();

            model.Items.Add(newModelItem);
            var ResponseAddItem = await Facade.Update((int)model.Id, model, "Unit test");

            Assert.NotEqual(ResponseAddItem, 0);

            model.Items.Remove(newModelItem);
            model.Items.FirstOrDefault().Details.Remove(oldDetail);
            var ResponseRemoveItemDetail = await Facade.Update((int)model.Id, model, "Unit test");

            Assert.NotEqual(ResponseRemoveItemDetail, 0);
        }
        public async Task <int> Update(int id, DeliveryOrder model, string user)
        {
            int Updated = 0;

            using (var transaction = this.dbContext.Database.BeginTransaction())
            {
                try
                {
                    var existingModel = this.dbSet.AsNoTracking()
                                        .Include(d => d.Items)
                                        .ThenInclude(d => d.Details)
                                        .AsNoTracking()
                                        .SingleOrDefault(pr => pr.Id == id && !pr.IsDeleted);

                    if (existingModel != null && id == model.Id)
                    {
                        EntityExtension.FlagForUpdate(model, user, USER_AGENT);

                        foreach (var item in model.Items.ToList())
                        {
                            var existingItem = existingModel.Items.SingleOrDefault(m => m.Id == item.Id);
                            List <DeliveryOrderItem> duplicateDeliveryOrderItems = model.Items.Where(i => i.EPOId == item.EPOId && i.Id != item.Id).ToList();

                            if (item.Id == 0)
                            {
                                if (duplicateDeliveryOrderItems.Count <= 0)
                                {
                                    if (model.Items.Count(i => i.EPOId == item.EPOId && !string.IsNullOrWhiteSpace(i.CreatedBy)) < 1)
                                    {
                                        EntityExtension.FlagForCreate(item, user, USER_AGENT);

                                        var itemDetails = new List <DeliveryOrderDetail>();

                                        foreach (var duplicateItem in model.Items.Where(i => i.EPOId == item.EPOId).ToList())
                                        {
                                            foreach (var duplicateDetail in duplicateItem.Details.ToList())
                                            {
                                                if (itemDetails.Count(d => d.PRId.Equals(duplicateDetail.PRId) && d.ProductId.Equals(duplicateDetail.ProductId)) < 1)
                                                {
                                                    EntityExtension.FlagForCreate(duplicateDetail, user, USER_AGENT);

                                                    itemDetails.Add(duplicateDetail);
                                                }
                                                else
                                                {
                                                    var oldDetail = itemDetails.FirstOrDefault(d => d.PRId.Equals(duplicateDetail.PRId) && d.ProductId.Equals(duplicateDetail.ProductId));
                                                    if (oldDetail != null)
                                                    {
                                                        oldDetail.DOQuantity   += duplicateDetail.DOQuantity;
                                                        oldDetail.ProductRemark = String.Concat(oldDetail.ProductRemark, Environment.NewLine, duplicateDetail.ProductRemark).Trim();
                                                    }
                                                }
                                            }
                                        }

                                        item.Details = itemDetails;

                                        foreach (var detail in item.Details.ToList())
                                        {
                                            ExternalPurchaseOrderDetail externalPurchaseOrderDetail = this.dbContext.ExternalPurchaseOrderDetails.SingleOrDefault(m => m.Id == detail.EPODetailId);

                                            if (externalPurchaseOrderDetail != null)
                                            {
                                                externalPurchaseOrderDetail.DOQuantity += detail.DOQuantity;
                                                EntityExtension.FlagForUpdate(externalPurchaseOrderDetail, user, USER_AGENT);

                                                SetStatus(externalPurchaseOrderDetail, detail, user);
                                            }
                                        }
                                    }
                                    else
                                    {
                                        model.Items.Remove(item);
                                    }
                                }
                            }
                            else
                            {
                                EntityExtension.FlagForUpdate(item, user, USER_AGENT);

                                if (duplicateDeliveryOrderItems.Count > 0)
                                {
                                    foreach (var detail in item.Details.ToList())
                                    {
                                        if (detail.Id != 0)
                                        {
                                            EntityExtension.FlagForUpdate(detail, user, USER_AGENT);

                                            foreach (var duplicateItem in duplicateDeliveryOrderItems.ToList())
                                            {
                                                foreach (var duplicateDetail in duplicateItem.Details.ToList())
                                                {
                                                    if (detail.PRId.Equals(duplicateDetail.PRId) && detail.ProductId.Equals(duplicateDetail.ProductId))
                                                    {
                                                        detail.DOQuantity   += duplicateDetail.DOQuantity;
                                                        detail.ProductRemark = String.Concat(detail.ProductRemark, Environment.NewLine, duplicateDetail.ProductRemark).Trim();
                                                    }
                                                    else if (item.Details.Count(d => d.PRId.Equals(duplicateDetail.PRId) && d.ProductId.Equals(duplicateDetail.ProductId)) < 1)
                                                    {
                                                        double duplicateDetailDOQuantity    = 0;
                                                        string duplicateDetailProductRemark = string.Empty;
                                                        foreach (var duplicateItemAgain in duplicateDeliveryOrderItems.ToList())
                                                        {
                                                            var duplicateDetailAgain = duplicateItemAgain.Details.SingleOrDefault(d => d.PRId.Equals(duplicateDetail.PRId) && d.ProductId.Equals(duplicateDetail.ProductId));
                                                            duplicateDetailDOQuantity   += duplicateDetailAgain.DOQuantity;
                                                            duplicateDetailProductRemark = String.Concat(duplicateDetailProductRemark, Environment.NewLine, duplicateDetailAgain.ProductRemark).Trim();
                                                        }
                                                        duplicateDetail.DOQuantity    = duplicateDetailDOQuantity;
                                                        duplicateDetail.ProductRemark = duplicateDetailProductRemark;

                                                        EntityExtension.FlagForCreate(duplicateDetail, user, USER_AGENT);
                                                        item.Details.Add(duplicateDetail);

                                                        ExternalPurchaseOrderDetail externalPurchaseOrderDetail = this.dbContext.ExternalPurchaseOrderDetails.SingleOrDefault(m => m.Id == duplicateDetail.EPODetailId);

                                                        if (externalPurchaseOrderDetail != null)
                                                        {
                                                            externalPurchaseOrderDetail.DOQuantity += duplicateDetail.DOQuantity;

                                                            EntityExtension.FlagForUpdate(externalPurchaseOrderDetail, user, USER_AGENT);
                                                            SetStatus(externalPurchaseOrderDetail, duplicateDetail, user);
                                                        }
                                                    }
                                                }
                                                model.Items.Remove(duplicateItem);
                                            }

                                            var existingDetail = existingItem.Details.SingleOrDefault(m => m.Id == detail.Id);
                                            if (existingDetail != null)
                                            {
                                                ExternalPurchaseOrderDetail externalPurchaseOrderDetail = this.dbContext.ExternalPurchaseOrderDetails.SingleOrDefault(m => m.Id == detail.EPODetailId);
                                                externalPurchaseOrderDetail.DOQuantity = externalPurchaseOrderDetail.DOQuantity - existingDetail.DOQuantity + detail.DOQuantity;

                                                EntityExtension.FlagForUpdate(externalPurchaseOrderDetail, user, USER_AGENT);
                                                SetStatus(externalPurchaseOrderDetail, detail, user);
                                            }
                                        }
                                    }
                                }
                                else
                                {
                                    foreach (var detail in item.Details)
                                    {
                                        if (detail.Id != 0)
                                        {
                                            EntityExtension.FlagForUpdate(detail, user, USER_AGENT);

                                            var existingDetail = existingItem.Details.SingleOrDefault(m => m.Id == detail.Id);

                                            ExternalPurchaseOrderDetail externalPurchaseOrderDetail = this.dbContext.ExternalPurchaseOrderDetails.SingleOrDefault(m => m.Id == detail.EPODetailId);

                                            if (externalPurchaseOrderDetail != null)
                                            {
                                                externalPurchaseOrderDetail.DOQuantity = externalPurchaseOrderDetail.DOQuantity - existingDetail.DOQuantity + detail.DOQuantity;
                                                EntityExtension.FlagForUpdate(externalPurchaseOrderDetail, user, USER_AGENT);
                                                SetStatus(externalPurchaseOrderDetail, detail, user);
                                            }
                                        }
                                    }
                                }
                            }
                        }

                        this.dbContext.Update(model);

                        foreach (var existingItem in existingModel.Items)
                        {
                            var newItem = model.Items.FirstOrDefault(i => i.Id == existingItem.Id);
                            if (newItem == null)
                            {
                                EntityExtension.FlagForDelete(existingItem, user, USER_AGENT);
                                this.dbContext.DeliveryOrderItems.Update(existingItem);
                                foreach (var existingDetail in existingItem.Details)
                                {
                                    EntityExtension.FlagForDelete(existingDetail, user, USER_AGENT);
                                    dbContext.Entry(existingDetail).State = EntityState.Modified;
                                    //this.dbContext.DeliveryOrderDetails.Update(existingDetail);

                                    ExternalPurchaseOrderDetail externalPurchaseOrderDetail = this.dbContext.ExternalPurchaseOrderDetails.SingleOrDefault(m => m.Id == existingDetail.EPODetailId);

                                    if (externalPurchaseOrderDetail != null)
                                    {
                                        externalPurchaseOrderDetail.DOQuantity -= existingDetail.DOQuantity;
                                        EntityExtension.FlagForUpdate(externalPurchaseOrderDetail, user, USER_AGENT);
                                        SetStatus(externalPurchaseOrderDetail, existingDetail, user);
                                    }
                                }
                            }
                            else
                            {
                                foreach (var existingDetail in existingItem.Details)
                                {
                                    var newDetail = newItem.Details.FirstOrDefault(d => d.Id == existingDetail.Id);
                                    if (newDetail == null)
                                    {
                                        EntityExtension.FlagForDelete(existingDetail, user, USER_AGENT);
                                        dbContext.Entry(existingDetail).State = EntityState.Modified;
                                        //this.dbContext.DeliveryOrderDetails.Update(existingDetail);

                                        ExternalPurchaseOrderDetail externalPurchaseOrderDetail = this.dbContext.ExternalPurchaseOrderDetails.SingleOrDefault(m => m.Id == existingDetail.EPODetailId);
                                        if (externalPurchaseOrderDetail != null)
                                        {
                                            externalPurchaseOrderDetail.DOQuantity -= existingDetail.DOQuantity;
                                            EntityExtension.FlagForUpdate(externalPurchaseOrderDetail, user, USER_AGENT);
                                            SetStatus(externalPurchaseOrderDetail, existingDetail, user);
                                        }
                                    }
                                }
                            }
                        }

                        Updated = await dbContext.SaveChangesAsync();

                        var updatedModel = this.dbSet.AsNoTracking()
                                           .Include(d => d.Items)
                                           .ThenInclude(d => d.Details)
                                           .SingleOrDefault(pr => pr.Id == model.Id && !pr.IsDeleted);
                        Updated += await EditFulfillmentAsync(updatedModel, user);

                        transaction.Commit();
                    }
                    else
                    {
                        throw new Exception("Invalid Id");
                    }
                }
                catch (Exception e)
                {
                    transaction.Rollback();
                    while (e.InnerException != null)
                    {
                        e = e.InnerException;
                    }
                    throw e;
                }
            }

            return(Updated);
        }
        public PurchasingDisposition GetNewData()
        {
            var datas    = Task.Run(() => externalPurchaseOrderDataUtil.GetTestData("unit-test")).Result;
            var itemData = datas.Items;
            ExternalPurchaseOrderDetail detailData = new ExternalPurchaseOrderDetail();
            ExternalPurchaseOrderItem   itemdata   = new ExternalPurchaseOrderItem();

            foreach (var item in itemData)
            {
                itemdata = item; break;
            }
            foreach (var detail in itemdata.Details)
            {
                detailData = detail; break;
            }
            return(new PurchasingDisposition
            {
                SupplierId = "1",
                SupplierCode = "Supplier1",
                SupplierName = "supplier1",

                Bank = "Bank",
                Amount = 1000,
                Calculation = "axb+c",
                //InvoiceNo="test",
                ConfirmationOrderNo = "test",
                //Investation = "test",

                PaymentDueDate = new DateTimeOffset(),
                ProformaNo = "aaa",
                PaymentMethod = "Test",

                Remark = "Remark1",



                Items = new List <PurchasingDispositionItem>
                {
                    new PurchasingDispositionItem
                    {
                        EPOId = datas.Id.ToString(),
                        EPONo = datas.EPONo,
                        IncomeTaxId = "1",
                        IncomeTaxName = "tax",
                        IncomeTaxRate = 1,
                        UseIncomeTax = true,
                        UseVat = true,
                        Details = new List <PurchasingDispositionDetail>
                        {
                            new PurchasingDispositionDetail
                            {
                                //EPODetailId=detailData.Id.ToString(),
                                CategoryCode = "test",
                                CategoryId = "1",
                                CategoryName = "test",
                                DealQuantity = 10,
                                PaidQuantity = 1000,
                                DealUomId = "1",
                                DealUomUnit = "test",
                                PaidPrice = 1000,
                                PricePerDealUnit = 100,
                                PriceTotal = 10000,
                                PRId = "1",
                                PRNo = "test",
                                ProductCode = "test",
                                ProductName = "test",
                                ProductId = "1",
                                UnitName = "test",
                                UnitCode = "test",
                                UnitId = "1",
                            }
                        }
                    }
                }
            });
        }
Exemple #15
0
        public int Delete(int id, string user)
        {
            int Deleted = 0;

            using (var transaction = this.dbContext.Database.BeginTransaction())
            {
                try
                {
                    var m = this.dbSet
                            .Include(d => d.Items)
                            .SingleOrDefault(pr => pr.Id == id && !pr.IsDeleted);

                    EntityExtension.FlagForDelete(m, user, USER_AGENT);

                    foreach (var item in m.Items)
                    {
                        EntityExtension.FlagForDelete(item, user, USER_AGENT);

                        ExternalPurchaseOrderDetail externalPurchaseOrderDetail = this.dbContext.ExternalPurchaseOrderDetails.FirstOrDefault(s => s.IsDeleted == false && s.Id == item.EPODetailId);
                        PurchaseRequestItem         prItem    = this.dbContext.PurchaseRequestItems.FirstOrDefault(s => s.IsDeleted == false && s.Id == externalPurchaseOrderDetail.PRItemId);
                        InternalPurchaseOrderItem   poItem    = this.dbContext.InternalPurchaseOrderItems.FirstOrDefault(s => s.IsDeleted == false && s.Id == externalPurchaseOrderDetail.POItemId);
                        DeliveryOrderDetail         doDetail  = dbContext.DeliveryOrderDetails.FirstOrDefault(s => s.IsDeleted == false && s.Id == item.DODetailId);
                        UnitPaymentOrderDetail      upoDetail = dbContext.UnitPaymentOrderDetails.FirstOrDefault(s => s.IsDeleted == false && s.POItemId == poItem.Id);
                        doDetail.ReceiptQuantity -= item.ReceiptQuantity;
                        externalPurchaseOrderDetail.ReceiptQuantity -= item.ReceiptQuantity;
                        if (externalPurchaseOrderDetail.ReceiptQuantity == 0 && upoDetail == null)
                        {
                            if (externalPurchaseOrderDetail.DOQuantity > 0 && externalPurchaseOrderDetail.DOQuantity >= externalPurchaseOrderDetail.DealQuantity)
                            {
                                //prItem.Status = "Barang sudah diterima Unit semua";
                                poItem.Status = "Barang sudah datang semua";
                            }
                            else if (externalPurchaseOrderDetail.DOQuantity > 0 && externalPurchaseOrderDetail.DOQuantity < externalPurchaseOrderDetail.DealQuantity)
                            {
                                //prItem.Status = "Barang sudah diterima Unit parsial";
                                poItem.Status = "Barang sudah datang parsial";
                            }
                        }
                        else if (externalPurchaseOrderDetail.ReceiptQuantity > 0 && upoDetail == null)
                        {
                            if (externalPurchaseOrderDetail.DOQuantity >= externalPurchaseOrderDetail.DealQuantity)
                            {
                                if (externalPurchaseOrderDetail.ReceiptQuantity < externalPurchaseOrderDetail.DealQuantity)
                                {
                                    //prItem.Status = "Barang sudah diterima Unit parsial";
                                    poItem.Status = "Barang sudah diterima Unit parsial";
                                }
                                else if (externalPurchaseOrderDetail.ReceiptQuantity >= externalPurchaseOrderDetail.DealQuantity)
                                {
                                    //prItem.Status = "Barang sudah diterima Unit semua";
                                    poItem.Status = "Barang sudah diterima Unit semua";
                                }
                                else if (externalPurchaseOrderDetail.DOQuantity < externalPurchaseOrderDetail.DealQuantity)
                                {
                                    poItem.Status = "Barang sudah diterima Unit parsial";
                                }
                            }
                        }
                    }
                    if (m.IsStorage == true)
                    {
                        insertStorage(m, user, "OUT");
                    }

                    Deleted = dbContext.SaveChanges();
                    transaction.Commit();
                }
                catch (Exception e)
                {
                    transaction.Rollback();
                    throw new Exception(e.Message);
                }
            }

            return(Deleted);
        }
Exemple #16
0
        public async Task <int> Create(UnitReceiptNote m, string user)
        {
            int Created = 0;

            using (var transaction = this.dbContext.Database.BeginTransaction())
            {
                try
                {
                    EntityExtension.FlagForCreate(m, user, "Facade");

                    m.URNNo = await GenerateNo(m);

                    if (m.Items != null)
                    {
                        foreach (var item in m.Items)
                        {
                            EntityExtension.FlagForCreate(item, user, "Facade");
                            ExternalPurchaseOrderDetail externalPurchaseOrderDetail = this.dbContext.ExternalPurchaseOrderDetails.FirstOrDefault(s => s.Id == item.EPODetailId);
                            PurchaseRequestItem         prItem    = this.dbContext.PurchaseRequestItems.FirstOrDefault(s => s.Id == externalPurchaseOrderDetail.PRItemId);
                            InternalPurchaseOrderItem   poItem    = this.dbContext.InternalPurchaseOrderItems.FirstOrDefault(s => s.Id == externalPurchaseOrderDetail.POItemId);
                            DeliveryOrderDetail         doDetail  = dbContext.DeliveryOrderDetails.FirstOrDefault(s => s.Id == item.DODetailId);
                            UnitPaymentOrderDetail      upoDetail = dbContext.UnitPaymentOrderDetails.FirstOrDefault(s => s.IsDeleted == false && s.POItemId == poItem.Id);
                            item.PRItemId             = doDetail.PRItemId;
                            item.PricePerDealUnit     = externalPurchaseOrderDetail.PricePerDealUnit;
                            doDetail.ReceiptQuantity += item.ReceiptQuantity;
                            externalPurchaseOrderDetail.ReceiptQuantity += item.ReceiptQuantity;
                            if (upoDetail == null)
                            {
                                if (externalPurchaseOrderDetail.DOQuantity >= externalPurchaseOrderDetail.DealQuantity)
                                {
                                    if (externalPurchaseOrderDetail.ReceiptQuantity < externalPurchaseOrderDetail.DealQuantity)
                                    {
                                        //prItem.Status = "Barang sudah diterima Unit parsial";
                                        poItem.Status = "Barang sudah diterima Unit parsial";
                                    }
                                    else
                                    {
                                        //prItem.Status = "Barang sudah diterima Unit semua";
                                        poItem.Status = "Barang sudah diterima Unit semua";
                                    }
                                }
                                else
                                {
                                    //prItem.Status = "Barang sudah diterima Unit parsial";
                                    poItem.Status = "Barang sudah diterima Unit parsial";
                                }
                            }
                        }
                    }
                    if (m.IsStorage == true)
                    {
                        insertStorage(m, user, "IN");
                    }
                    this.dbSet.Add(m);
                    Created = await dbContext.SaveChangesAsync();

                    transaction.Commit();
                }
                catch (Exception e)
                {
                    transaction.Rollback();
                    throw new Exception(e.Message);
                }
            }

            return(Created);
        }