Ejemplo n.º 1
0
        public MaterialSetupInfo GetMaterialInfo(string materialName)
        {
            var info = m_materialFacade.GetMaterialInfo(materialName);

            if (info?.MaterialId == null)
            {
                return(null);
            }

            return(info);
        }
Ejemplo n.º 2
0
        public void ProcessFile(InvoiceModel model)
        {
            if (model == null)
            {
                throw new InvalidOperationException("Invalid model");
            }

            var now = DateTime.Now;

            if (!(model.Date.Year == now.Year && model.Date.Month == now.Month))
            {
                throw new Exception("Lze naskladnit pouze v aktuálním měsíci");
            }

            var supplier = m_supplierRepository.GetSupplier(model.SupplierName ?? string.Empty).Ensure($"Neexistující dodavatel \"{model.SupplierName}\"");
            var currency = m_currencyRepository.GetCurrency(model.Currency).Ensure($"Neexistující symbol měny \"{model.Currency}\"");

            if (string.IsNullOrWhiteSpace(model.InvoiceNumber))
            {
                throw new InvalidOperationException("Chybí číslo faktury");
            }

            var validItems = model.Items.Where(i => !string.IsNullOrWhiteSpace(i.MaterialName)).ToList();

            if (!validItems.Any())
            {
                throw new InvalidOperationException("Žádné položky");
            }

            var noPriced = validItems.FirstOrDefault(i => i.Price < 0.0001m || i.Quantity < 0.0001m);

            if (noPriced != null)
            {
                throw new InvalidOperationException($"Položka \"{noPriced.MaterialName}\" nemá cenu nebo mnozstvi");
            }

            decimal priceFactor = model.TotalPrice / validItems.Sum(i => i.Price);

            var itemsWithCorrectedPrices = new List <Tuple <InvoiceItem, decimal> >(validItems.Count);

            foreach (var item in validItems)
            {
                itemsWithCorrectedPrices.Add(new Tuple <InvoiceItem, decimal>(item, item.Price * priceFactor));
            }

            using (var tx = m_database.OpenTransaction())
            {
                var existingBatches = m_batchRepository.GetBatchesByInvoiceNumber(model.InvoiceNumber, supplier.Id).ToList();

                foreach (var itemWithCorrectedPrice in itemsWithCorrectedPrices)
                {
                    var invoiceItem = itemWithCorrectedPrice.Item1;

                    var material = m_materialRepository.GetMaterialByName(invoiceItem.MaterialName)
                                   .Ensure($"Neznámý materiál \"{invoiceItem.MaterialName}\"");

                    var unit = m_unitRepository.GetUnitBySymbol(invoiceItem.Unit)
                               .Ensure($"Neznámá jednotka \"{invoiceItem.Unit}");



                    if (invoiceItem.Id > 0)
                    {
                        throw new NotSupportedException($"Toto jeste neni podporovano :(");

                        //var existing = existingBatches.FirstOrDefault(b => b.Id == invoiceItem.Id);
                        //if (existing == null)
                        //{
                        //    throw new InvalidOperationException($"Soubor obsahuje polozku s id={invoiceItem.Id}. Toto ID sarze ale nebylo v databazi nalezeno");
                        //}

                        //existingBatches.Remove(existing);

                        //m_batchRepository.UpdateBatch(invoiceItem.Id, b =>
                        //{
                        //    b.BatchNumber = invoiceItem.BatchNumber;
                        //    b.Created = receiveDate;
                        //    b.InvoiceNr = model.InvoiceNumber;
                        //    b.InvoiceVarSymbol = model.VarSymbol;
                        //    b.Price = itemWithCorrectedPrice.Item2;
                        //    b.
                        //});
                    }

                    var batchNumber = invoiceItem.BatchNumber?.Trim();

                    if (string.IsNullOrWhiteSpace(batchNumber))
                    {
                        var materialInfo = m_materialFacade.GetMaterialInfo(invoiceItem.MaterialName);
                        if (materialInfo == null)
                        {
                            throw new InvalidOperationException($"Neznamy material {invoiceItem.MaterialName}");
                        }

                        if (!materialInfo.AutomaticBatches)
                        {
                            throw new InvalidOperationException($"Pro materiál \"{invoiceItem.MaterialName}\" musí být uvedeno čslo šarže");
                        }

                        batchNumber = materialInfo.AutoBatchNr;
                    }

                    m_batchRepository.SaveBottomLevelMaterialBatch(0,
                                                                   material.Adaptee,
                                                                   invoiceItem.Quantity,
                                                                   unit,
                                                                   batchNumber,
                                                                   model.Date,
                                                                   itemWithCorrectedPrice.Item2,
                                                                   model.InvoiceNumber,
                                                                   supplier.Name,
                                                                   currency.Symbol,
                                                                   model.VarSymbol);
                }

                tx.Commit();
            }
        }
Ejemplo n.º 3
0
        public void Process(ProductionRequestContext context)
        {
            var material = m_materialFacade.GetMaterialInfo(context.Recipe.ProducedMaterialId);

            context.Request.MaterialName = material.MaterialName;

            // Batch number
            if (string.IsNullOrWhiteSpace(context.Request.ProducingBatchNumber))
            {
                if (material.AutomaticBatches)
                {
                    context.Request.ProducingBatchNumber = material.AutoBatchNr;
                }
                else
                {
                    context.InvalidateRequest("Nutno vyplnit číslo šarže");
                }
            }

            // Unit
            while (true)
            {
                if (string.IsNullOrWhiteSpace(context.Request.ProducingUnitSymbol))
                {
                    context.Request.ProducingUnitSymbol = material.PreferredUnitSymbol;
                    break;
                }

                if (!context.Request.ProducingUnitSymbol.Equals(material.PreferredUnitSymbol, StringComparison.InvariantCultureIgnoreCase))
                {
                    var usedUnit = m_unitRepository.GetUnitBySymbol(context.Request.ProducingUnitSymbol.Trim());
                    if (usedUnit == null)
                    {
                        context.Request.ProducingUnitSymbol = null;
                        continue;
                    }

                    var mainUnit = m_unitRepository.GetUnitBySymbol(material.PreferredUnitSymbol);
                    if (!m_conversionHelper.AreCompatible(usedUnit.Id, mainUnit.Id))
                    {
                        context.Request.ProducingUnitSymbol = null;
                        continue;
                    }
                }

                break;
            }

            context.RequestedAmount     = new Amount(context.Request.ProducingAmount ?? 0m, m_unitRepository.GetUnitBySymbol(context.Request.ProducingUnitSymbol));
            context.NominalRecipeAmount = new Amount(context.Recipe.RecipeProducedAmount, m_unitRepository.GetUnit(context.Recipe.ProducedAmountUnitId));

            var commonUnit = m_conversionHelper.GetSmallestCompatibleUnit(context.RequestedAmount.Unit);

            var convertedRequestedAmount = m_conversionHelper.ConvertAmount(context.RequestedAmount, commonUnit.Id);
            var convertedNominalAmount   = m_conversionHelper.ConvertAmount(context.NominalRecipeAmount, commonUnit.Id);

            context.ComponentMultiplier = convertedRequestedAmount.Value / convertedNominalAmount.Value;

            if (context.MinimalAmount != null && m_amountProcessor.GreaterThan(context.MinimalAmount, context.RequestedAmount))
            {
                context.InvalidateRequest($"Nové množství nesmí být méně než {context.MinimalAmount}, protože tolik již bylo spotřebováno");
            }
        }