Ejemplo n.º 1
0
        public async Task <IActionResult> OnGetAsync(int?companyFilter, int?section, int?copyFromId)
        {
            RoutedCompanyId = companyFilter ?? 0;
            RoutedSectionId = section ?? 0;
            CopyFromId      = copyFromId ?? 0;

            if (CopyFromId > 0)
            {
                var buyMatDoc = await _context.BuyDocuments
                                .Include(b => b.Company)
                                .Include(b => b.FiscalPeriod)
                                .Include(b => b.BuyDocSeries)
                                .Include(b => b.BuyDocType)
                                .Include(b => b.Section)

                                .Include(b => b.Transactor)
                                .Include(b => b.BuyDocLines)
                                .ThenInclude(m => m.WarehouseItem)
                                .FirstOrDefaultAsync(m => m.Id == CopyFromId);

                if (buyMatDoc == null)
                {
                    return(NotFound());
                }
                //ItemVm = _mapper.Map<BuyDocCreateAjaxDto>(buyMatDoc);
                CopyFromItemVm = _mapper.Map <BuyDocModifyDto>(buyMatDoc);
                //check for new values or old values
                var vmLines = CopyFromItemVm.BuyDocLines;
                foreach (var vmLine in vmLines)
                {
                    if (vmLine.TransactionUnitId == 0)
                    {
                        vmLine.TransactionUnitId     = vmLine.PrimaryUnitId;
                        vmLine.TransactionUnitFactor = 1;
                        vmLine.TransUnitPrice        = vmLine.UnitPrice;
                        vmLine.TransactionQuantity   = vmLine.Quontity1;
                    }
                }
                ItemVm = new BuyDocCreateAjaxDto
                {
                    AmountDiscount  = CopyFromItemVm.AmountDiscount,
                    AmountFpa       = CopyFromItemVm.AmountFpa,
                    AmountNet       = CopyFromItemVm.AmountNet,
                    BuyDocSeriesId  = CopyFromItemVm.BuyDocSeriesId,
                    CompanyId       = CopyFromItemVm.CompanyId,
                    Etiology        = CopyFromItemVm.Etiology,
                    PaymentMethodId = CopyFromItemVm.PaymentMethodId,
                    TransactorId    = CopyFromItemVm.TransactorId
                };
            }
            LoadCombos();
            return(Page());
        }
        public async Task <IActionResult> OnGetAsync(int?companyFilter, int?section, int?copyFromId)
        {
            RoutedCompanyId = (companyFilter ?? 0);
            RoutedSectionId = (section ?? 0);
            CopyFromId      = (copyFromId ?? 0);

            if (CopyFromId > 0)
            {
                var buyMatDoc = await _context.BuyDocuments
                                .Include(b => b.Company)
                                .Include(b => b.FiscalPeriod)
                                .Include(b => b.BuyDocSeries)
                                .Include(b => b.BuyDocType)
                                .Include(b => b.Section)

                                .Include(b => b.Transactor)
                                .Include(b => b.BuyDocLines)
                                .ThenInclude(m => m.WarehouseItem)
                                .FirstOrDefaultAsync(m => m.Id == CopyFromId);

                if (buyMatDoc == null)
                {
                    return(NotFound());
                }
                //ItemVm = _mapper.Map<BuyDocCreateAjaxDto>(buyMatDoc);
                CopyFromItemVm = _mapper.Map <BuyDocModifyDto>(buyMatDoc);
                ItemVm         = new BuyDocCreateAjaxDto
                {
                    AmountDiscount  = CopyFromItemVm.AmountDiscount,
                    AmountFpa       = CopyFromItemVm.AmountFpa,
                    AmountNet       = CopyFromItemVm.AmountNet,
                    BuyDocSeriesId  = CopyFromItemVm.BuyDocSeriesId,
                    CompanyId       = CopyFromItemVm.CompanyId,
                    Etiology        = CopyFromItemVm.Etiology,
                    PaymentMethodId = CopyFromItemVm.PaymentMethodId,
                    TransactorId    = CopyFromItemVm.TransactorId
                };
            }
            LoadCombos();
            return(Page());
        }
        private async Task <IActionResult> CreateBuyDocFromRecTrans(BuyDocCreateAjaxDto data,
                                                                    RecurringTransDoc recurringTransDoc)
        {
            const string sectionCode = "SYS-BUY-MATERIALS-SCN";
            // bool noSupplierTrans = false;
            bool noWarehouseTrans = false;

            #region BuyDocument

            BuyDocCreateAjaxNoLinesDto transToAttachNoLines;
            BuyDocument transToAttach;
            DateTime    dateOfTrans;

            if (data == null)
            {
                return(BadRequest(new
                {
                    error = "Empty request data"
                }));
            }

            try
            {
                transToAttachNoLines = _mapper.Map <BuyDocCreateAjaxNoLinesDto>(data);
                transToAttach        = _mapper.Map <BuyDocument>(transToAttachNoLines);
                dateOfTrans          = data.TransDate;
            }
            catch (Exception e)
            {
                return(BadRequest(new
                {
                    error = e.Message
                }));
            }

            var tr = _context.Database.CurrentTransaction;
            using (var transaction = _context.Database.BeginTransaction())
            {
                #region Fiscal Period

                var fiscalPeriod = await _context.FiscalPeriods.FirstOrDefaultAsync(p =>
                                                                                    dateOfTrans >= p.StartDate && dateOfTrans <= p.EndDate);

                if (fiscalPeriod == null)
                {
                    transaction.Rollback();
                    ModelState.AddModelError(string.Empty, "No Fiscal Period covers Transaction Date");
                    return(NotFound(new
                    {
                        error = "No Fiscal Period covers Transaction Date"
                    }));
                }

                #endregion

                var docSeries = await
                                _context.BuyDocSeriesDefs.SingleOrDefaultAsync(m => m.Id == data.BuyDocSeriesId);

                if (docSeries is null)
                {
                    transaction.Rollback();
                    ModelState.AddModelError(string.Empty, "Δεν βρέθηκε η σειρά παραστατικού");
                    return(NotFound(new
                    {
                        error = "Buy Doc Series not found"
                    }));
                }

                await _context.Entry(docSeries).Reference(t => t.BuyDocTypeDef).LoadAsync();

                var docTypeDef = docSeries.BuyDocTypeDef;
                //await _context.Entry(docTypeDef)
                //      .Reference(t => t.TransSupplierDef)
                //      .LoadAsync();
                await _context.Entry(docTypeDef)
                .Reference(t => t.TransTransactorDef)
                .LoadAsync();

                await _context.Entry(docTypeDef).Reference(t => t.TransWarehouseDef)
                .LoadAsync();

                #region Section Management

                int sectionId = 0;
                if (docTypeDef.SectionId == 0)
                {
                    var sectn = await _context.Sections.SingleOrDefaultAsync(s => s.SystemName == sectionCode);

                    if (sectn == null)
                    {
                        transaction.Rollback();
                        ModelState.AddModelError(string.Empty, "Δεν υπάρχει το Section");
                        return(NotFound(new
                        {
                            error = "Could not locate section "
                        }));
                    }

                    sectionId = sectn.Id;
                }
                else
                {
                    sectionId = docTypeDef.SectionId;
                }

                #endregion

                //var transSupplierDef = docTypeDef.TransSupplierDef;
                var transTransactorDef = docTypeDef.TransTransactorDef;
                var transWarehouseDef  = docTypeDef.TransWarehouseDef;

                transToAttach.SectionId      = sectionId;
                transToAttach.FiscalPeriodId = fiscalPeriod.Id;
                transToAttach.BuyDocTypeId   = docSeries.BuyDocTypeDefId;
                //transToAttach.Id = 0;
                _context.BuyDocuments.Add(transToAttach);

                try
                {
                    await _context.SaveChangesAsync();
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    transaction.Rollback();
                    string msg = e.InnerException?.Message;
                    return(BadRequest(new
                    {
                        error = e.Message + " " + msg
                    }));
                }

                var docId = _context.Entry(transToAttach).Entity.Id;


                if (transTransactorDef.DefaultDocSeriesId > 0)
                {
                    var transTransactorDefaultSeries = await
                                                       _context.TransTransactorDocSeriesDefs.FirstOrDefaultAsync(p =>
                                                                                                                 p.Id == transTransactorDef.DefaultDocSeriesId);

                    if (transTransactorDefaultSeries == null)
                    {
                        transaction.Rollback();
                        ModelState.AddModelError(string.Empty, "Default series for transactor transaction not found");
                        return(NotFound(new
                        {
                            error = "Default series for transactor transaction not found"
                        }));
                    }

                    var sTransactorTransaction = _mapper.Map <TransactorTransaction>(data);
                    sTransactorTransaction.TransactorId             = data.TransactorId;
                    sTransactorTransaction.SectionId                = sectionId;
                    sTransactorTransaction.TransTransactorDocTypeId =
                        transTransactorDefaultSeries.TransTransactorDocTypeDefId;
                    sTransactorTransaction.TransTransactorDocSeriesId = transTransactorDefaultSeries.Id;
                    sTransactorTransaction.FiscalPeriodId             = fiscalPeriod.Id;
                    sTransactorTransaction.CreatorId = docId;
                    ActionHandlers.TransactorFinAction(transTransactorDef.FinancialTransAction, sTransactorTransaction);
                    sTransactorTransaction.Id = 0;
                    _context.TransactorTransactions.Add(sTransactorTransaction);
                    try
                    {
                        await _context.SaveChangesAsync();
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                        transaction.Rollback();
                        string msg = e.InnerException.Message;
                        return(BadRequest(new
                        {
                            error = e.Message + " " + msg
                        }));
                    }
                }

                //Αυτόματη εξόφληση
                var paymentMethod =
                    await _context.PaymentMethods.FirstOrDefaultAsync(p => p.Id == transToAttach.PaymentMethodId);

                if (paymentMethod is null)
                {
                    transaction.Rollback();
                    ModelState.AddModelError(string.Empty, "Δεν βρέθηκε ο τρόπος πληρωμής");
                    return(NotFound(new
                    {
                        error = "Δεν βρέθηκε ο τρόπος πληρωμής"
                    }));
                }

                if (paymentMethod.AutoPayoffWay == SeriesAutoPayoffEnum.SeriesAutoPayoffEnumAuto)
                {
                    var autoPaySeriesId = transToAttach.BuyDocSeries.PayoffSeriesId;
                    if (autoPaySeriesId > 0)
                    {
                        var transTransactorPayOffSeries = await
                                                          _context.TransTransactorDocSeriesDefs.FirstOrDefaultAsync(p =>
                                                                                                                    p.Id == autoPaySeriesId);

                        if (transTransactorPayOffSeries == null)
                        {
                            transaction.Rollback();
                            ModelState.AddModelError(string.Empty, "AutoPayOff series not found");
                            return(NotFound(new
                            {
                                error = "AutoPayOff series not found"
                            }));
                        }

                        var sTransactorTransaction = _mapper.Map <TransactorTransaction>(data);
                        sTransactorTransaction.TransactorId             = data.TransactorId;
                        sTransactorTransaction.SectionId                = sectionId;
                        sTransactorTransaction.TransTransactorDocTypeId =
                            transTransactorPayOffSeries.TransTransactorDocTypeDefId;
                        sTransactorTransaction.TransTransactorDocSeriesId = transTransactorPayOffSeries.Id;
                        sTransactorTransaction.FiscalPeriodId             = fiscalPeriod.Id;
                        sTransactorTransaction.Etiology  = "AutoPayOff";
                        sTransactorTransaction.CreatorId = docId;
                        await _context.Entry(transTransactorPayOffSeries)
                        .Reference(t => t.TransTransactorDocTypeDef)
                        .LoadAsync();

                        var transTransactorDocTypeDef = transTransactorPayOffSeries.TransTransactorDocTypeDef;

                        await _context.Entry(transTransactorDocTypeDef)
                        .Reference(t => t.TransTransactorDef)
                        .LoadAsync();

                        var transPaymentTransactorDef = transTransactorDocTypeDef.TransTransactorDef;

                        ActionHandlers.TransactorFinAction(transPaymentTransactorDef.FinancialTransAction,
                                                           sTransactorTransaction);
                        _context.TransactorTransactions.Add(sTransactorTransaction);
                        try
                        {
                            await _context.SaveChangesAsync();
                        }
                        catch (Exception e)
                        {
                            transaction.Rollback();
                            string msg = e.InnerException.Message;
                            return(BadRequest(new
                            {
                                error = e.Message + " " + msg
                            }));
                        }
                    }
                }

                int warehouseSeriesId = 0;
                int warehouseTypeId   = 0;

                if (transWarehouseDef.DefaultDocSeriesId > 0)
                {
                    var transWarehouseDefaultSeries =
                        await _context.TransWarehouseDocSeriesDefs.FirstOrDefaultAsync(p =>
                                                                                       p.Id == transWarehouseDef.DefaultDocSeriesId);

                    if (transWarehouseDefaultSeries == null)
                    {
                        transaction.Rollback();
                        ModelState.AddModelError(string.Empty, "Default series for warehouse transaction not found");
                        return(NotFound(new
                        {
                            error = "Default series for warehouse transaction not found"
                        }));
                    }

                    noWarehouseTrans  = false;
                    warehouseSeriesId = transWarehouseDef.DefaultDocSeriesId;
                    warehouseTypeId   = transWarehouseDefaultSeries.TransWarehouseDocTypeDefId;
                }
                else
                {
                    noWarehouseTrans = true;
                }

                foreach (var dataBuyDocLine in data.BuyDocLines)
                {
                    var warehouseItemId = dataBuyDocLine.WarehouseItemId;
                    var material        = await _context.WarehouseItems.SingleOrDefaultAsync(p => p.Id == warehouseItemId);

                    if (material is null)
                    {
                        //Handle error
                        transaction.Rollback();
                        ModelState.AddModelError(string.Empty, "Doc Line error null WarehouseItem");
                        return(NotFound(new
                        {
                            error = "Could not locate material in Doc Line "
                        }));
                    }

                    #region MaterialLine

                    var     buyMaterialLine    = new BuyDocLine();
                    decimal unitPrice          = dataBuyDocLine.Price;
                    decimal units              = (decimal)dataBuyDocLine.Q1;
                    decimal fpaRate            = (decimal)dataBuyDocLine.FpaRate;
                    decimal discountRate       = (decimal)dataBuyDocLine.DiscountRate;
                    decimal lineNetAmount      = unitPrice * units;
                    decimal lineDiscountAmount = lineNetAmount * discountRate;
                    decimal lineFpaAmount      = (lineNetAmount - lineDiscountAmount) * fpaRate;
                    buyMaterialLine.UnitPrice       = unitPrice;
                    buyMaterialLine.AmountFpa       = lineFpaAmount;
                    buyMaterialLine.AmountNet       = lineNetAmount;
                    buyMaterialLine.AmountDiscount  = lineDiscountAmount;
                    buyMaterialLine.DiscountRate    = discountRate;
                    buyMaterialLine.FpaRate         = fpaRate;
                    buyMaterialLine.WarehouseItemId = dataBuyDocLine.WarehouseItemId;
                    buyMaterialLine.Quontity1       = dataBuyDocLine.Q1;
                    buyMaterialLine.Quontity2       = dataBuyDocLine.Q2;
                    buyMaterialLine.PrimaryUnitId   = dataBuyDocLine.MainUnitId;
                    buyMaterialLine.SecondaryUnitId = dataBuyDocLine.SecUnitId;
                    buyMaterialLine.Factor          = dataBuyDocLine.Factor;
                    buyMaterialLine.BuyDocumentId   = docId;
                    buyMaterialLine.Etiology        = transToAttach.Etiology;
                    //_context.Entry(transToAttach).Entity
                    transToAttach.BuyDocLines.Add(buyMaterialLine);

                    #endregion

                    if (!noWarehouseTrans)
                    {
                        #region Warehouse transaction

                        var warehouseTrans = new WarehouseTransaction
                        {
                            FpaRate                   = fpaRate,
                            DiscountRate              = discountRate,
                            UnitPrice                 = unitPrice,
                            AmountDiscount            = lineDiscountAmount,
                            AmountNet                 = lineNetAmount,
                            AmountFpa                 = lineFpaAmount,
                            CompanyId                 = transToAttach.CompanyId,
                            Etiology                  = transToAttach.Etiology,
                            FiscalPeriodId            = transToAttach.FiscalPeriodId,
                            WarehouseItemId           = warehouseItemId,
                            PrimaryUnitId             = dataBuyDocLine.MainUnitId,
                            SecondaryUnitId           = dataBuyDocLine.SecUnitId,
                            SectionId                 = sectionId,
                            CreatorId                 = transToAttach.Id,
                            TransDate                 = transToAttach.TransDate,
                            TransRefCode              = transToAttach.TransRefCode,
                            UnitFactor                = (decimal)dataBuyDocLine.Factor,
                            TransWarehouseDocSeriesId = warehouseSeriesId,
                            TransWarehouseDocTypeId   = warehouseTypeId
                        };

                        ActionHandlers.ItemNatureHandler(material.WarehouseItemNature, warehouseTrans,
                                                         transWarehouseDef);
                        ActionHandlers.ItemInventoryActionHandler(warehouseTrans.InventoryAction, dataBuyDocLine.Q1,
                                                                  dataBuyDocLine.Q2,
                                                                  warehouseTrans);
                        ActionHandlers.ItemInventoryValueActionHandler(warehouseTrans.InventoryValueAction,
                                                                       warehouseTrans);
                        _context.WarehouseTransactions.Add(warehouseTrans);

                        #endregion
                    }
                }

                try
                {
                    await _context.SaveChangesAsync();
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    transaction.Rollback();
                    string msg = e.InnerException.Message;
                    return(BadRequest(new
                    {
                        error = e.Message + " " + msg
                    }));
                }

                #endregion

                var curDate  = recurringTransDoc.NextTransDate;
                var nextDate = GetNextTransactionDate(curDate, recurringTransDoc.RecurringFrequency);
                recurringTransDoc.NextTransDate         = nextDate;
                _context.Entry(recurringTransDoc).State = EntityState.Modified;
                try
                {
                    await _context.SaveChangesAsync();

                    transaction.Commit();
                }
                catch (Exception e)
                {
                    transaction.Rollback();
                    string msg = e.InnerException.Message;
                    return(BadRequest(new
                    {
                        error = e.Message + " " + msg
                    }));
                }
            }

            return(Ok());
        }