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)); } }
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); }
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); }
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)); } }