Exemplo n.º 1
0
        private IEnumerable <MaterialComponent> ProcessMaterialEntries(string[] materialEntries)
        {
            foreach (var textEntry in materialEntries.Where(s => !string.IsNullOrWhiteSpace(s)))
            {
                var entry = MaterialEntry.Parse(textEntry);

                if (!(entry.Amount > 0m))
                {
                    throw new ArgumentException($"Chybné množství {entry.Amount} - musí být větší než 0");
                }

                var material = m_materialRepository.GetMaterialByName(entry.MaterialName);
                if (material == null)
                {
                    throw new ArgumentException($"Materiál \"{entry.MaterialName}\" neexistuje");
                }

                var entryUnit = m_unitRepository.GetUnitBySymbol(entry.UnitName);
                if (entryUnit == null)
                {
                    throw new ArgumentException($"Neznámá jednotka \"{entry.UnitName}\"");
                }

                if (!m_unitConversionHelper.AreCompatible(material.NominalUnit.Id, entryUnit.Id))
                {
                    throw new ArgumentException($"Pro materiál \"{entry.MaterialName}\" nelze použít jednotku \"{entry.UnitName}\", protože není převoditelná na nominální jednotku materiálu \"{material.NominalUnit.Symbol}\"");
                }

                yield return(new MaterialComponent(entryUnit, material, entry.Amount, null));
            }
        }
Exemplo n.º 2
0
        public void SaveRecipe(RecipeEditRequest rq)
        {
            if (string.IsNullOrWhiteSpace(rq.ProducedAmountText))
            {
                throw new InvalidOperationException("Vyráběné množství je třeba zadat");
            }

            if (string.IsNullOrWhiteSpace(rq.RecipeName))
            {
                throw new InvalidOperationException("Název receptury musí být zadán");
            }

            var recipeMaterial = m_materialRepository.GetMaterialById(rq.MaterialId).Ensure();
            var recipeAmount   = MaterialEntry.Parse(rq.ProducedAmountText, true).GetAmount(m_unitRepository);

            var items = new List <RecipeComponentModel>();

            foreach (var srcItem in rq.Items)
            {
                if (string.IsNullOrWhiteSpace(srcItem.Text))
                {
                    continue;
                }

                try
                {
                    var entry = MaterialEntry.Parse(srcItem.Text);

                    var componentMaterial = m_materialRepository.GetMaterialByName(entry.MaterialName);
                    if (componentMaterial == null)
                    {
                        throw new InvalidOperationException($"Neznámý materiál \"{entry.MaterialName}\"");
                    }

                    if (componentMaterial.Id == recipeMaterial.Id)
                    {
                        throw new InvalidOperationException($"Receptura nesmí obsahovat ve složení svůj vlastní výsledný materiál \"{entry.MaterialName}\"");
                    }

                    var model = new RecipeComponentModel
                    {
                        IsTransformationSource = srcItem.IsTransformationSource,
                        SortOrder  = items.Count,
                        MaterialId = componentMaterial.Id,
                        Amount     = entry.GetAmount(m_unitRepository)
                    };

                    items.Add(model);
                }
                catch (Exception e)
                {
                    throw new InvalidOperationException($"Chybné zadání složky \"{srcItem.Text}\": {e.Message}", e);
                }
            }

            m_recipes.SaveRecipe(recipeMaterial.Id, rq.RecipeId, rq.RecipeName.Trim(), rq.ProductionPrice, recipeAmount,
                                 rq.Note?.Trim(), items);
        }
Exemplo n.º 3
0
        public void SetThreshold(int materialId, string thresholdText)
        {
            if (string.IsNullOrEmpty(thresholdText))
            {
                m_materialThresholdRepository.DeleteThreshold(materialId);
                return;
            }

            var thresholdEntry = MaterialEntry.Parse(thresholdText, true);

            var thresholdUnit = m_unitRepository.GetUnitBySymbol(thresholdEntry.UnitName);

            if (thresholdUnit == null)
            {
                throw new InvalidOperationException($"Neznámý symbol jednotky \"{thresholdEntry.UnitName}\"");
            }

            m_materialThresholdRepository.SaveThreshold(materialId,
                                                        thresholdEntry.Amount,
                                                        thresholdUnit.Id);
        }
Exemplo n.º 4
0
        public IExtendedMaterialModel ProcessMaterialEditRequest(int?materialId,
                                                                 string name,
                                                                 string nominalAmountText,
                                                                 int materialInventoryId,
                                                                 bool automaticBatches,
                                                                 bool requiresPrice,
                                                                 bool requiresProductionPrice,
                                                                 bool requiresIncvoice,
                                                                 bool requiresSupplierReference,
                                                                 bool autofinalize,
                                                                 bool canBeDigital,
                                                                 IEnumerable <string> components,
                                                                 string thresholdText
                                                                 )
        {
            name = name?.Trim();

            if (string.IsNullOrWhiteSpace(name))
            {
                throw new InvalidOperationException("Materiál musí mít název");
            }

            if (string.IsNullOrWhiteSpace(nominalAmountText))
            {
                throw new ArgumentException("Materiál musí mít vlastní množství a jednotku");
            }

            var nominalAmountEntry = MaterialEntry.Parse(nominalAmountText, true);

            var nominalUnit = ValidateAmountUnit(nominalAmountEntry);

            using (var tx = m_database.OpenTransaction())
            {
                var material = m_materialRepository.UpsertMaterial(
                    materialId,
                    name,
                    nominalAmountEntry.Amount,
                    nominalUnit.Id,
                    materialInventoryId,
                    automaticBatches,
                    requiresPrice,
                    requiresProductionPrice,
                    requiresIncvoice,
                    requiresSupplierReference, autofinalize, canBeDigital);

                if (thresholdText == null)
                {
                    m_materialThresholdRepository.DeleteThreshold(material.Id);
                }
                else
                {
                    try
                    {
                        var thresholdEntry = MaterialEntry.Parse(thresholdText, true);

                        var thresholdUnit = m_unitRepository.GetUnitBySymbol(thresholdEntry.UnitName);
                        if (thresholdUnit == null)
                        {
                            throw new InvalidOperationException($"Neznámý symbol jednotky \"{thresholdEntry.UnitName}\"");
                        }

                        m_materialThresholdRepository.SaveThreshold(material.Id,
                                                                    thresholdEntry.Amount,
                                                                    thresholdUnit.Id);
                    }
                    catch (Exception ex)
                    {
                        throw new InvalidOperationException($"Nelze nastavit sledování minimálního množství - {ex.Message}", ex);
                    }
                }

                tx.Commit();
                m_virtualProductRepository.CleanCache();
                m_materialRepository.CleanCache();
                return(m_materialRepository.GetMaterialById(material.Id));
            }
        }