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

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

                    m.EPONo = await GenerateNo(m, clientTimeZoneOffset);

                    foreach (var item in m.Items)
                    {
                        EntityExtension.FlagForCreate(item, user, "Facade");
                        foreach (var detail in item.Details)
                        {
                            detail.PricePerDealUnit = detail.IncludePpn ? (100 * detail.PriceBeforeTax) / 110 : detail.PriceBeforeTax;
                            //PurchaseRequestItem purchaseRequestItem = this.dbContext.PurchaseRequestItems.FirstOrDefault(s => s.Id == detail.PRItemId);
                            //purchaseRequestItem.Status = "Sudah diorder ke Supplier";
                            EntityExtension.FlagForCreate(detail, user, "Facade");

                            InternalPurchaseOrderItem internalPurchaseOrderItem = this.dbContext.InternalPurchaseOrderItems.FirstOrDefault(s => s.Id == detail.POItemId);
                            internalPurchaseOrderItem.Status = "Sudah dibuat PO Eksternal";
                        }
                        InternalPurchaseOrder internalPurchaseOrder = this.dbContext.InternalPurchaseOrders.FirstOrDefault(s => s.Id == item.POId);
                        internalPurchaseOrder.IsPosted = true;
                    }

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

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

            return(Created);
        }
Example #2
0
        public async Task <ExternalPurchaseOrderViewModel> GetNewDataViewModel(string user)
        {
            InternalPurchaseOrder internalPurchaseOrder = await internalPurchaseOrderDataUtil.GetTestData(user);


            return(new ExternalPurchaseOrderViewModel
            {
                unit = new UnitViewModel
                {
                    _id = internalPurchaseOrder.UnitId,
                    code = internalPurchaseOrder.UnitCode,
                    name = internalPurchaseOrder.UnitName,
                    division = new DivisionViewModel
                    {
                        _id = internalPurchaseOrder.DivisionId,
                        code = internalPurchaseOrder.DivisionCode,
                        name = internalPurchaseOrder.DivisionName,
                    }
                },
                currency = new CurrencyViewModel
                {
                    code = "CurrencyCode",
                    _id = "CurrencyId",
                    rate = 0.5,
                },
                freightCostBy = "test",
                deliveryDate = DateTime.Now.AddDays(1),
                orderDate = DateTime.Now,
                supplier = new SupplierViewModel
                {
                    code = "sup",
                    _id = "supId",
                    name = "Supplier",
                },
                paymentMethod = "test",
                poCashType = "test",
                remark = "Remark",
                items = new List <ExternalPurchaseOrderItemViewModel> {
                    externalPurchaseOrderItemDataUtil.GetNewDataViewModel(internalPurchaseOrder)
                }
            });
        }
Example #3
0
        public async Task Should_Error_Update_Data_when_Quantity_is_same()
        {
            InternalPurchaseOrder model = await DataUtil.GetTestData("dev2");

            var responseGetById = await this.Client.GetAsync($"{URI}/{model.Id}");

            var json = responseGetById.Content.ReadAsStringAsync().Result;

            Dictionary <string, object> result = JsonConvert.DeserializeObject <Dictionary <string, object> >(json.ToString());

            Assert.True(result.ContainsKey("apiVersion"));
            Assert.True(result.ContainsKey("message"));
            Assert.True(result.ContainsKey("data"));
            Assert.True(result["data"].GetType().Name.Equals("JObject"));

            InternalPurchaseOrderViewModel viewModel = JsonConvert.DeserializeObject <InternalPurchaseOrderViewModel>(result.GetValueOrDefault("data").ToString());

            var response = await this.Client.PutAsync($"{URI}/{model.Id}", new StringContent(JsonConvert.SerializeObject(viewModel).ToString(), Encoding.UTF8, MediaType));

            Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
        }
Example #4
0
        public async Task <int> Update(int id, InternalPurchaseOrder internalPurchaseOrder, string user)
        {
            int Updated = 0;

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

                    if (m != null)
                    {
                        EntityExtension.FlagForUpdate(internalPurchaseOrder, user, "Facade");

                        foreach (var item in internalPurchaseOrder.Items)
                        {
                            EntityExtension.FlagForUpdate(item, user, "Facade");
                        }

                        this.dbContext.Update(internalPurchaseOrder);
                        Updated = await dbContext.SaveChangesAsync();

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

            return(Updated);
        }
Example #5
0
        public async Task Should_Error_Split_Data_When_Quantity_Splited_Bigger_than_Quantity_Before_Splited()
        {
            InternalPurchaseOrder model = await DataUtil.GetTestData("dev2");

            InternalPurchaseOrderViewModel viewModel = await DataUtil.GetNewDataViewModel("dev2");

            viewModel.prNo     = null;
            viewModel.prDate   = DateTimeOffset.MinValue;
            viewModel.budget   = null;
            viewModel.unit     = null;
            viewModel.category = null;
            foreach (var items in viewModel.items)
            {
                items._id      = 0;
                items.quantity = items.quantity + items.quantity;
            }
            //List<InternalPurchaseOrderViewModel> viewModelList = new List<InternalPurchaseOrderViewModel> { viewModel };

            var response = await this.Client.PostAsync($"{URI}/spliting/{viewModel._id}", new StringContent(JsonConvert.SerializeObject(viewModel).ToString(), Encoding.UTF8, MediaType));

            Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
        }
        public int EPOClose(int id, string user)
        {
            int Updated = 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.FlagForUpdate(m, user, "Facade");
                    m.IsClosed = true;

                    foreach (var item in m.Items)
                    {
                        EntityExtension.FlagForUpdate(item, user, "Facade");
                        foreach (var detail in item.Details)
                        {
                            EntityExtension.FlagForUpdate(detail, user, "Facade");
                        }
                        InternalPurchaseOrder internalPurchaseOrder = this.dbContext.InternalPurchaseOrders.FirstOrDefault(s => s.Id == item.POId);
                        internalPurchaseOrder.IsClosed = true;
                    }

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

            return(Updated);
        }
 public IActionResult Get(int id)
 {
     try
     {
         InternalPurchaseOrder          model     = _facade.ReadById(id);
         InternalPurchaseOrderViewModel viewModel = _mapper.Map <InternalPurchaseOrderViewModel>(model);
         return(Ok(new
         {
             apiVersion = ApiVersion,
             statusCode = General.OK_STATUS_CODE,
             message = General.OK_MESSAGE,
             data = viewModel,
         }));
     }
     catch (Exception e)
     {
         Dictionary <string, object> Result =
             new ResultFormatter(ApiVersion, General.INTERNAL_ERROR_STATUS_CODE, e.Message)
             .Fail();
         return(StatusCode(General.INTERNAL_ERROR_STATUS_CODE, Result));
     }
 }
Example #8
0
        public ExternalPurchaseOrderItem GetNewData(InternalPurchaseOrder internalPurchaseOrder)
        {
            List <InternalPurchaseOrderItem> detail = new List <InternalPurchaseOrderItem>();

            foreach (var POdetail in internalPurchaseOrder.Items)
            {
                detail.Add(POdetail);
            }
            return(new ExternalPurchaseOrderItem
            {
                POId = internalPurchaseOrder.Id,
                PRId = Convert.ToInt64(internalPurchaseOrder.PRId),
                PONo = internalPurchaseOrder.PONo,
                PRNo = internalPurchaseOrder.PRNo,
                UnitCode = "unitcode",
                UnitName = "unit",
                UnitId = "unitId",
                Details = new List <ExternalPurchaseOrderDetail> {
                    externalPurchaseOrderDetailDataUtil.GetNewData(detail)
                }
            });
        }
        public async Task <IActionResult> Post([FromBody] InternalPurchaseOrderViewModel vm)
        {
            identityService.Token    = Request.Headers["Authorization"].First().Replace("Bearer ", "");
            identityService.Username = User.Claims.Single(p => p.Type.Equals("username")).Value;
            InternalPurchaseOrder m = _mapper.Map <InternalPurchaseOrder>(vm);
            ValidateService       validateService = (ValidateService)_facade.serviceProvider.GetService(typeof(ValidateService));

            try
            {
                validateService.Validate(vm);

                int result = await _facade.Create(m, identityService.Username);

                if (result.Equals(0))
                {
                    return(StatusCode(500));
                }
                else
                {
                    return(Created(Request.Path, result));
                }
            }
            catch (ServiceValidationExeption e)
            {
                Dictionary <string, object> Result =
                    new ResultFormatter(ApiVersion, General.BAD_REQUEST_STATUS_CODE, General.BAD_REQUEST_MESSAGE)
                    .Fail(e);
                return(BadRequest(Result));
            }
            catch (Exception e)
            {
                Dictionary <string, object> Result =
                    new ResultFormatter(ApiVersion, General.INTERNAL_ERROR_STATUS_CODE, e.Message)
                    .Fail();
                return(StatusCode(General.INTERNAL_ERROR_STATUS_CODE, Result));
            }
        }
Example #10
0

        
        public async Task <int> Update(int id, ExternalPurchaseOrder externalPurchaseOrder, 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);

                    if (existingModel != null && id == externalPurchaseOrder.Id)
                    {
                        EntityExtension.FlagForUpdate(externalPurchaseOrder, user, "Facade");
                        if (externalPurchaseOrder.UseIncomeTax == false)
                        {
                            externalPurchaseOrder.IncomeTaxBy = "";
                        }
                        foreach (var item in externalPurchaseOrder.Items.ToList())
                        {
                            var existingItem = existingModel.Items.SingleOrDefault(m => m.Id == item.Id);
                            List <ExternalPurchaseOrderItem> duplicateExternalPurchaseOrderItems = externalPurchaseOrder.Items.Where(i => i.POId == item.POId && i.Id != item.Id).ToList();

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

                                    foreach (var detail in item.Details)
                                    {
                                        detail.PricePerDealUnit = detail.IncludePpn ? (100 * detail.PriceBeforeTax) / 110 : detail.PriceBeforeTax;
                                        EntityExtension.FlagForCreate(detail, user, "Facade");
                                        //PurchaseRequestItem purchaseRequestItem = this.dbContext.PurchaseRequestItems.FirstOrDefault(s => s.Id == detail.PRItemId);
                                        //purchaseRequestItem.Status = "Sudah diorder ke Supplier";

                                        InternalPurchaseOrderItem internalPurchaseOrderItem = this.dbContext.InternalPurchaseOrderItems.FirstOrDefault(s => s.Id == detail.POItemId);
                                        internalPurchaseOrderItem.Status = "Sudah dibuat PO Eksternal";
                                    }
                                    InternalPurchaseOrder internalPurchaseOrder = this.dbContext.InternalPurchaseOrders.FirstOrDefault(s => s.Id == item.POId);
                                    internalPurchaseOrder.IsPosted = true;
                                }
                            }
                            else
                            {
                                EntityExtension.FlagForUpdate(item, user, "Facade");

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

                                            foreach (var duplicateItem in duplicateExternalPurchaseOrderItems.ToList())
                                            {
                                                foreach (var duplicateDetail in duplicateItem.Details.ToList())
                                                {
                                                    if (detail.ProductId.Equals(duplicateDetail.ProductId))
                                                    {
                                                        detail.PricePerDealUnit = detail.IncludePpn ? (100 * detail.PriceBeforeTax) / 110 : detail.PriceBeforeTax;
                                                    }
                                                    else if (item.Details.Count(d => d.ProductId.Equals(duplicateDetail.ProductId)) < 1)
                                                    {
                                                        EntityExtension.FlagForCreate(duplicateDetail, user, "Facade");
                                                        item.Details.Add(duplicateDetail);
                                                        duplicateDetail.PricePerDealUnit = duplicateDetail.IncludePpn ? (100 * duplicateDetail.PriceBeforeTax) / 110 : duplicateDetail.PriceBeforeTax;
                                                        //PurchaseRequestItem purchaseRequestItem = this.dbContext.PurchaseRequestItems.FirstOrDefault(s => s.Id == detail.PRItemId);
                                                        //purchaseRequestItem.Status = "Sudah diorder ke Supplier";

                                                        InternalPurchaseOrderItem internalPurchaseOrderItem = this.dbContext.InternalPurchaseOrderItems.FirstOrDefault(s => s.Id == detail.POItemId);
                                                        internalPurchaseOrderItem.Status = "Sudah dibuat PO Eksternal";
                                                    }
                                                }
                                                externalPurchaseOrder.Items.Remove(duplicateItem);
                                            }
                                        }
                                    }
                                }
                                else
                                {
                                    foreach (var detail in item.Details)
                                    {
                                        if (detail.Id != 0)
                                        {
                                            EntityExtension.FlagForUpdate(detail, user, "Facade");
                                            detail.PricePerDealUnit = detail.IncludePpn ? (100 * detail.PriceBeforeTax) / 110 : detail.PriceBeforeTax;
                                        }
                                    }
                                }
                            }
                        }

                        this.dbContext.Update(externalPurchaseOrder);

                        foreach (var existingItem in existingModel.Items)
                        {
                            var newItem = externalPurchaseOrder.Items.FirstOrDefault(i => i.Id == existingItem.Id);
                            if (newItem == null)
                            {
                                EntityExtension.FlagForDelete(existingItem, user, "Facade");
                                InternalPurchaseOrder internalPurchaseOrder = this.dbContext.InternalPurchaseOrders.FirstOrDefault(s => s.Id == existingItem.POId);
                                internalPurchaseOrder.IsPosted = false;
                                this.dbContext.ExternalPurchaseOrderItems.Update(existingItem);
                                foreach (var existingDetail in existingItem.Details)
                                {
                                    EntityExtension.FlagForDelete(existingDetail, user, "Facade");
                                    //PurchaseRequestItem purchaseRequestItem = this.dbContext.PurchaseRequestItems.FirstOrDefault(s => s.Id == existingDetail.PRItemId);
                                    //purchaseRequestItem.Status = "Sudah diterima Pembelian";
                                    existingDetail.PricePerDealUnit = existingDetail.IncludePpn ? (100 * existingDetail.PriceBeforeTax) / 110 : existingDetail.PriceBeforeTax;

                                    InternalPurchaseOrderItem internalPurchaseOrderItem = this.dbContext.InternalPurchaseOrderItems.FirstOrDefault(s => s.Id == existingDetail.POItemId);
                                    internalPurchaseOrderItem.Status = "PO Internal belum diorder";
                                    this.dbContext.ExternalPurchaseOrderDetails.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");
                                        //PurchaseRequestItem purchaseRequestItem = this.dbContext.PurchaseRequestItems.FirstOrDefault(s => s.Id == existingDetail.PRItemId);
                                        //purchaseRequestItem.Status = "Sudah diterima Pembelian";
                                        existingDetail.PricePerDealUnit = existingDetail.IncludePpn ? (100 * existingDetail.PriceBeforeTax) / 110 : existingDetail.PriceBeforeTax;

                                        InternalPurchaseOrderItem internalPurchaseOrderItem = this.dbContext.InternalPurchaseOrderItems.FirstOrDefault(s => s.Id == existingDetail.POItemId);
                                        internalPurchaseOrderItem.Status = "PO Internal belum diorder";
                                        this.dbContext.ExternalPurchaseOrderDetails.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);
        }
Example #12
0
        public async Task <ExternalPurchaseOrder> GetNewData(string user)
        {
            InternalPurchaseOrder internalPurchaseOrder = await internalPurchaseOrderDataUtil.GetTestData(user);

            //List<ExternalPurchaseOrderDetail> detail = new List<ExternalPurchaseOrderDetail>();
            //foreach (var POdetail in internalPurchaseOrder.Items)
            //{
            //    detail.Add(new ExternalPurchaseOrderDetail
            //    {
            //        POItemId = POdetail.Id,
            //        PRItemId = Convert.ToInt64(POdetail.PRItemId),
            //        ProductId = "ProductId",
            //        ProductCode = "ProductCode",
            //        ProductName = "ProductName",
            //        DefaultQuantity = 10,
            //        DealUomId = "UomId",
            //        DealUomUnit = "Uom",
            //        ProductRemark = "Remark",
            //        PriceBeforeTax = 1000,
            //        PricePerDealUnit = 200,
            //        DealQuantity = POdetail.Quantity
            //    });
            //}
            //List<ExternalPurchaseOrderItem> items = new List<ExternalPurchaseOrderItem>();
            //items.Add(new ExternalPurchaseOrderItem
            //{
            //    POId = internalPurchaseOrder.Id,
            //    PRId = Convert.ToInt64(internalPurchaseOrder.PRId),
            //    PONo = internalPurchaseOrder.PONo,
            //    PRNo = internalPurchaseOrder.PRNo,
            //    UnitCode = "unitcode",
            //    UnitName = "unit",
            //    UnitId = "unitId",
            //    Details = detail
            //});

            return(new ExternalPurchaseOrder
            {
                CurrencyCode = "CurrencyCode",
                CurrencyId = "CurrencyId",
                CurrencyRate = 0.5,
                UnitId = "UnitId",
                UnitCode = "UnitCode",
                UnitName = "UnitName",
                DivisionId = "DivisionId",
                DivisionCode = "DivisionCode",
                DivisionName = "DivisionName",
                FreightCostBy = "test",
                DeliveryDate = DateTime.Now.AddDays(1),
                OrderDate = DateTime.Now,
                SupplierCode = "sup",
                SupplierId = "supId",
                IncomeTaxName = "Final",
                IncomeTaxRate = "1.5",
                UseIncomeTax = true,
                SupplierName = "Supplier",
                PaymentMethod = "test",
                Remark = "Remark",
                Items = new List <ExternalPurchaseOrderItem> {
                    externalPurchaseOrderItemDataUtil.GetNewData(internalPurchaseOrder)
                }
            });
        }
Example #13
0
        public async Task <int> Split(int id, InternalPurchaseOrder internalPurchaseOrder, string user)
        {
            int Splitted = 0;
            InternalPurchaseOrder UpdateData = ReadByIdforSplit(id);

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

                    if (m != null)
                    {
                        var poNoTemp = m.PONo;
                        EntityExtension.FlagForUpdate(UpdateData, user, "Facade");
                        EntityExtension.FlagForCreate(internalPurchaseOrder, user, "Facade");

                        foreach (var itemUpdate in UpdateData.Items)
                        {
                            foreach (var item in internalPurchaseOrder.Items)
                            {
                                if (item.ProductId == itemUpdate.ProductId)
                                {
                                    if (item.Quantity <= itemUpdate.Quantity)
                                    {
                                        EntityExtension.FlagForUpdate(itemUpdate, user, "Facade");
                                        itemUpdate.Quantity = itemUpdate.Quantity - item.Quantity;
                                        EntityExtension.FlagForCreate(item, user, "Facade");
                                        item.Id   = 0;
                                        item.POId = 0;
                                    }
                                }
                            }
                        }
                        internalPurchaseOrder.Id   = 0;
                        internalPurchaseOrder.PONo = await this.GeneratePONo(UpdateData);

                        internalPurchaseOrder.Active       = UpdateData.Active;
                        internalPurchaseOrder.BudgetCode   = UpdateData.BudgetCode;
                        internalPurchaseOrder.BudgetId     = UpdateData.BudgetId;
                        internalPurchaseOrder.BudgetName   = UpdateData.BudgetName;
                        internalPurchaseOrder.CategoryCode = UpdateData.CategoryCode;
                        internalPurchaseOrder.CategoryId   = UpdateData.CategoryId;
                        internalPurchaseOrder.CategoryName = UpdateData.CategoryName;
                        internalPurchaseOrder.DivisionCode = UpdateData.DivisionCode;
                        internalPurchaseOrder.DivisionId   = UpdateData.DivisionId;
                        internalPurchaseOrder.UId          = UpdateData.UId;
                        internalPurchaseOrder.UnitCode     = UpdateData.UnitCode;
                        internalPurchaseOrder.UnitId       = UpdateData.UnitId;
                        UpdateData.PONo = poNoTemp;
                        this.dbContext.InternalPurchaseOrders.Add(internalPurchaseOrder);
                        this.dbContext.Update(UpdateData);
                        Splitted = await dbContext.SaveChangesAsync();

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