public MaterialSetupInfo GetMaterialInfo(string materialName) { var info = m_materialFacade.GetMaterialInfo(materialName); if (info?.MaterialId == null) { return(null); } return(info); }
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(); } }
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"); } }