public static RemaindEx rebuildRemain(Remaind inRemaind, List <string> excludeProperty) { RemaindEx r = null; if (inRemaind != null) { r = new RemaindEx(inRemaind.Id); if (!isExclude(excludeProperty, "RemaindDate")) { r.RemaindDate = inRemaind.RemaindDate; } if (!isExclude(excludeProperty, "Storage")) { r.Storage = rebuildStorage(inRemaind.Storage, rebuildExcludeProperty(excludeProperty, "Storage")); } if (!isExclude(excludeProperty, "StorageName")) { r.StorageName = rebuildStorageName(inRemaind.StorageName, rebuildExcludeProperty(excludeProperty, "StorageName")); } if (!isExclude(excludeProperty, "Nomenclature")) { r.Nomenclature = rebuildNomenclature(inRemaind.Nomenclature, rebuildExcludeProperty(excludeProperty, "Nomenclature")); } if (!isExclude(excludeProperty, "Growth")) { r.Growth = rebuildNomBodyPartSize(inRemaind.Growth, rebuildExcludeProperty(excludeProperty, "Growth")); } if (!isExclude(excludeProperty, "NomBodyPartSize")) { r.NomBodyPartSize = rebuildNomBodyPartSize(inRemaind.NomBodyPartSize, rebuildExcludeProperty(excludeProperty, "NomBodyPartSize")); } r.Wear = inRemaind.Wear; r.Quantity = inRemaind.Quantity; } return(r); }
public void SaveOnStorage(HttpResponseBase response, String date, int storageNameId, IEnumerable <HttpPostedFileBase> attachments) { // The Name of the Upload component is "attachments" IFormatProvider culture = new System.Globalization.CultureInfo("ru-RU", true); StorageName storageName = storageNameRepository.Get(storageNameId); if (storageName == null) { response.Write("Выбранный склад не найден в БД!<br/>"); response.Flush(); return; } DateTime remaindDate; DateTime.TryParseExact(date, DataGlobals.DATE_FORMAT_FULL_YEAR, null, System.Globalization.DateTimeStyles.None, out remaindDate); if (remaindDate == null) { response.Write("Ошибка в дате остатков!<br/>"); response.Flush(); return; } foreach (var file in attachments) { // Some browsers send file names with full path. This needs to be stripped. var isError = false; var fileName = Path.GetFileName(file.FileName); response.Write("Обрабатывается файл <b>" + fileName + "</b><br/>"); response.Flush(); var physicalFilePath = Path.Combine(Server.MapPath("~/TempFiles"), fileName); try { if (System.IO.File.Exists(physicalFilePath)) { System.IO.File.Delete(physicalFilePath); } try { file.SaveAs(physicalFilePath); } catch (Exception e) { response.Write("Ошибка при охранении файла на сервере:<br/>"); response.Write(e.Message); response.Flush(); isError = true; } System.Data.DataTable table = null; string workSheetNames = ""; if (!isError) { try { ExcelReader excelReader = new ExcelReader(physicalFilePath, true); if (excelReader.workSheetNames.Length > 0) { workSheetNames = excelReader.workSheetNames[0]; table = excelReader.GetWorksheet(workSheetNames); } else { response.Write("В файле не найден рабочий лист!<br/>"); response.Flush(); isError = true; } } catch (Exception e) { response.Write("Ошибка при открытии файла:<br/>"); response.Write(e.Message); response.Flush(); isError = true; } } if (table != null) { response.Write("Загрузка данных производится из листа с именем '" + workSheetNames.Trim(new[] { '$' }) + "'<br/>"); response.Flush(); //if (!table.Columns.Contains("Код склада")) //{ // response.Write("Файл содержит не коррекные данные ('Код склада').<br/>"); // isError = true; //} if (!table.Columns.Contains("Номенклатурный номер")) { response.Write("Файл содержит не коррекные данные ('Номенклатурный номер').<br/>"); response.Flush(); isError = true; } if (!table.Columns.Contains("Износ")) { response.Write("Файл содержит не коррекные данные ('Износ').<br/>"); response.Flush(); isError = true; } if (!table.Columns.Contains("Кол-во")) { response.Write("Файл содержит не коррекные данные ('Кол-во').<br/>"); response.Flush(); isError = true; } // int colStorage = table.Columns.IndexOf("Код склада"); int colNomenclature = table.Columns.IndexOf("Номенклатурный номер"); int colWear = table.Columns.IndexOf("Износ"); int colCount = table.Columns.IndexOf("Кол-во"); if (!isError) { // DataRow[] result = table.Select("F2 = '*' and F3=" + storageName.Plant + " and F4 in (" + storageName.StorageNumber + ")"); //remaindRepository.TruncRamains(storageNameId, date,null); // Удаление ранее расчитаных остатков //storageRepository.TruncStorage(storageNameId); DataRow[] result = table.Select(); Dictionary <string, object> queryParams = new Dictionary <string, object>(); int idOrg = int.Parse(getCurrentEnterpriseId()); Organization currentOrg = organizationRepository.Get(idOrg); foreach (DataRow row in result) // Loop over the rows. { if (row[colNomenclature] != System.DBNull.Value) { // Ищем id номенклатуры на руках( сверила все номенклатуры, в справочнике есть все) queryParams.Clear(); queryParams.Add("Organization", currentOrg); queryParams.Add("ExternalCode", row[colNomenclature].ToString()); queryParams.Add("IsActive", true); IList <Nomenclature> nomenclatures = nomenclatureRepository.GetByLikeCriteria(queryParams); if (nomenclatures.Count == 0) { queryParams.Clear(); queryParams.Add("Organization", currentOrg); queryParams.Add("ExternalCode", row[colNomenclature].ToString()); queryParams.Add("IsActive", false); nomenclatures = nomenclatureRepository.GetByLikeCriteria(queryParams); if (nomenclatures.Count == 0) { response.Write("Номенклатура с № " + row[colNomenclature].ToString() + " не найдена в системе!<br/>"); response.Flush(); continue; } } int quantity = 0; if (!int.TryParse(row[colCount].ToString(), out quantity)) { response.Write("У номенклатуры " + row[colNomenclature] + " ошибка в кол-ве!<br/>"); response.Flush(); continue; } string wear = row[colWear].ToString(); if ((wear != "100") && (wear != "50")) { response.Write("У номенклатуры " + row[colNomenclature] + " ошибка в износе! Допустимые изачения 100 или 50. <br/>"); response.Flush(); continue; } // Ищем есть ли подобная позиция на складе (номенклатура+рост+размер), считаем, что % годностиу всех 100 // Если не находим, то добавляем запись на склад с нулевым кол-вом queryParams.Clear(); queryParams.Add("StorageName", storageName); queryParams.Add("Nomenclature", nomenclatures[0]); queryParams.Add("Wear", wear); //Storage storage = storageRepository.FindOne(queryParams); IList <Storage> storages = storageRepository.GetByLikeCriteria(queryParams); Storage storage = null; if (storages.Count > 0) { storage = storages[0]; } if (storage == null) { storage = new Storage(); storage.StorageName = storageName; storage.Nomenclature = nomenclatures[0]; storage.Quantity = quantity; storage.Wear = wear; storageRepository.SaveOrUpdate(storage); } else { storage.Quantity = storage.Quantity + quantity; } storage.NomBodyPartSize = nomenclatures[0].NomBodyPartSize; storage.Growth = nomenclatures[0].Growth; Remaind remaind = new Remaind(); remaind.Growth = nomenclatures[0].Growth; remaind.Nomenclature = nomenclatures[0]; remaind.Quantity = quantity; remaind.Wear = int.Parse(wear); remaind.StorageName = storageName; remaind.RemaindDate = remaindDate; remaind.NomBodyPartSize = nomenclatures[0].NomBodyPartSize; remaind.ActualDate = DateTime.Now; try { storageRepository.DbContext.BeginTransaction(); storageRepository.SaveOrUpdate(storage); remaind.Storage = storage; remaindRepository.SaveOrUpdate(remaind); storageRepository.DbContext.CommitTransaction(); } catch (Exception e) { isError = true; response.Write("Для номенклатуры " + row[colNomenclature] + " произошла ошибка при сохранении данных в БД:<br/>"); response.Write(e.Message); response.Write("<br/>"); if (e.InnerException != null) { response.Write(e.InnerException.Message); response.Write("<br/>"); } response.Flush(); storageRepository.DbContext.RollbackTransaction(); } } } response.Flush(); } response.Flush(); } if (!isError) { response.Write("Файл успешно обработан!"); } } finally { System.IO.File.Delete(physicalFilePath); } } }
public static void rebuildRemaind(CriteriaRepository <Operation> operationRepository, CriteriaRepository <Remaind> remainsRepository, Storage storage, DateTime beginDate, DateTime endDate, DateTime remaindDate, bool saveZeroCount) { Dictionary <string, object> query = new Dictionary <string, object>(); int beginQuantity = 0; // ищем остатки за предыдущий период query.Add("Storage", storage); query.Add("RemaindDate", beginDate); IList <Remaind> beginRemainds = remainsRepository.FindAll(query); if (beginRemainds.Count > 0) { beginQuantity = beginRemainds[0].Quantity; } // ищем операции по позиции склада за период query.Clear(); query.Add("Storage", storage); query.Add("[>=]OperDate", beginDate); query.Add("[<=]OperDate", endDate); IList <Operation> operations = operationRepository.GetByLikeCriteria(query); // бежим по операциям и пересчитываем остаток foreach (var item in operations) { if (item.OperType != null) { if (item.OperType.Id == DataGlobals.OPERATION_STORAGE_IN || item.OperType.Id == DataGlobals.OPERATION_WORKER_RETURN || item.OperType.Id == DataGlobals.OPERATION_STORAGE_SAP_IN || item.OperType.Id == DataGlobals.OPERATION_MOL_STORAGE_IN ) { beginQuantity += item.Quantity; } else if (item.OperType.Id == DataGlobals.OPERATION_STORAGE_OUT || item.OperType.Id == DataGlobals.OPERATION_WORKER_IN || item.OperType.Id == DataGlobals.OPERATION_STORAGE_WEAR_OUT || item.OperType.Id == DataGlobals.OPERATION_MOL_STORAGE_OUT ) { // .DocNumber="0" данные на руках, загруженые в систему, не должны отражаться на состоянии склада if (item.DocNumber != "0") { beginQuantity -= item.Quantity; } } } } if ((saveZeroCount) || (saveZeroCount == false && beginQuantity != 0)) { //переписываем пересчитанный остаток query.Clear(); query.Add("Storage", storage); query.Add("RemaindDate", remaindDate); IList <Remaind> endRemainds = remainsRepository.FindAll(query); DateTime currentDate = DateTime.Now; if (endRemainds.Count > 0) { endRemainds[0].Quantity = beginQuantity; endRemainds[0].ActualDate = currentDate; remainsRepository.SaveOrUpdate(endRemainds[0]); } else { Remaind remaind = new Remaind(); remaind.NomBodyPartSize = storage.NomBodyPartSize; remaind.Nomenclature = storage.Nomenclature; remaind.Quantity = beginQuantity; remaind.RemaindDate = remaindDate; remaind.Storage = storage; remaind.StorageName = storage.StorageName; remaind.Wear = int.Parse(storage.Wear); remaind.Growth = storage.Growth; remaind.ActualDate = currentDate; remainsRepository.SaveOrUpdate(remaind); } } }
public static Remaind rebuildRemain(Remaind inRemain) { return(rebuildRemain(inRemain, null)); }
public void Storno(int id, int workerWorkplaceId, int StorageNameId) { Operation oper = operationRepository.Get(id); Operation operTransfer = oper.TransferOperation; if (oper == null) { ModelState.AddModelError("Сторнирование операции", "Операция не найдена!"); } else { if (oper.RefOperation != null) { ModelState.AddModelError("Сторнирование операции", "Повторное сторнирование операции!"); } } Dictionary <string, object> queryParams = new Dictionary <string, object>(); //Если операция связана с МОЛ if (oper.OperType.Id.In(DataGlobals.OPERATION_MOL_STORAGE_IN, /*Возврат дежурной на склад*/ DataGlobals.OPERATION_MOL_STORAGE_OUT, /*Выдача дежурной МОЛ со склада*/ DataGlobals.OPERATION_MOL_OUT, /*Списание дежурной с МОЛ*/ DataGlobals.OPERATION_MOL_WORKER_IN, /*Выдача дежурной от МОЛ работнику*/ DataGlobals.OPERATION_MOL_WORKER_RETURN, /*Возврат дежурной от работника МОЛ*/ DataGlobals.OPERATION_MOL_MOVE_OUT, /*Перевод дежурной. Списание с забаланса*/ DataGlobals.OPERATION_MOL_MOVE_IN /*Перевод дежурной. Постановка на забаланс*/)) { queryParams.Clear(); queryParams.Add("Operation", oper); var list = matPersonCardContentRepository.GetByCriteria(queryParams); MatPersonCardContent mpcc = null; if (list.Count > 0) { mpcc = list[0]; } else { ModelState.AddModelError("Сторнирование операции", "У МОЛ не найдена номенклатура для сторнирования!"); } queryParams.Clear(); queryParams.Add("Worker.Id", workerWorkplaceId); var mpchList = matPersonCardHeadRepository.GetByLikeCriteria(queryParams); MatPersonCardHead mpch = null; if (mpchList.Count > 0) { mpch = mpchList[0]; } queryParams.Clear(); queryParams.Add("MatPersonCardHead", mpch); queryParams.Add("Operation.Organization", oper.Organization); queryParams.Add("[in]Operation.OperType.Id", DataGlobals.OPERATION_MOL_STORAGE_IN + "," + /*Возврат дежурной на склад*/ DataGlobals.OPERATION_MOL_STORAGE_OUT + "," + /*Выдача дежурной МОЛ со склада*/ DataGlobals.OPERATION_MOL_OUT + "," + /*Списание дежурной с МОЛ*/ DataGlobals.OPERATION_MOL_WORKER_IN + "," + /*Выдача дежурной от МОЛ работнику*/ DataGlobals.OPERATION_MOL_WORKER_RETURN + "," + /*Возврат дежурной от работника МОЛ*/ DataGlobals.OPERATION_MOL_MOVE_OUT + "," + /*Перевод дежурной. Списание с забаланса*/ DataGlobals.OPERATION_MOL_MOVE_IN /*Перевод дежурной. Постановка на забаланс*/); queryParams.Add("[]Operation.RefOperation", null); queryParams.Add("[>]Operation.DocDate", oper.DocDate); var mpcclist = matPersonCardContentRepository.GetByCriteria(queryParams); if (mpcclist.Count > 0) { ModelState.AddModelError("Сторнирование операции", "У МОЛ была операция, которая по дате позже сторнируемой!"); } if (ModelState.IsValid) { if (oper.OperType.Id == DataGlobals.OPERATION_MOL_STORAGE_IN) { if (mpcc.Storage.Quantity < Math.Abs(mpcc.Quantity)) { ModelState.AddModelError("Сторнирование операции", "На складе не хватает номенклатуры!"); } else { // Т.к. при операции возврата mpcc.Quantity отрицательное, то нужно его * на -1 mpcc.Storage.Quantity = mpcc.Storage.Quantity - (-1) * mpcc.Quantity; } } if (oper.OperType.Id == DataGlobals.OPERATION_MOL_STORAGE_OUT) { mpcc.Storage.Quantity = mpcc.Storage.Quantity + mpcc.Quantity; } } // if (oper.OperType.Id == DataGlobals.OPERATION_MOL_OUT) { } if (oper.OperType.Id == DataGlobals.OPERATION_MOL_WORKER_IN || oper.OperType.Id == DataGlobals.OPERATION_MOL_WORKER_RETURN) { queryParams.Clear(); WorkerCardContent wcc = null; if (oper.OperType.Id == DataGlobals.OPERATION_MOL_WORKER_IN) { queryParams.Add("Operation", oper); } else { queryParams.Add("OperReturn", oper); } wcc = workerCardContentRepository.FindOne(queryParams); if (wcc == null) { ModelState.AddModelError("Сторнирование операции", "Не найдена номенклатура на карточке. Сторнирование не возможно! "); } if (wcc.OperReturn != null) { ModelState.AddModelError("Сторнирование выдачи", "У работника был возврат этой номенклатуры!"); } if ((wcc.Quantity - oper.Quantity) < 0) { ModelState.AddModelError("Сторнирование выдачи", "У работника на руках меньше кол-во номенклатуры!"); } if (ModelState.IsValid) { wcc.Quantity = wcc.Quantity - oper.Quantity; } } //Для операции "Перевод между МОЛ" обработка особая if (oper.OperType.Id == DataGlobals.OPERATION_MOL_MOVE_OUT || oper.OperType.Id == DataGlobals.OPERATION_MOL_MOVE_IN) { //Ищем операции для обоих МОЛ. queryParams.Clear(); queryParams.Add("DocNumber", oper.DocNumber); queryParams.Add("Organization", oper.Organization); queryParams.Add("Storage", oper.Storage); queryParams.Add("OperDate", oper.OperDate); queryParams.Add("DocDate", oper.DocDate); queryParams.Add("[in]OperType.Id", DataGlobals.OPERATION_MOL_MOVE_OUT + "," + DataGlobals.OPERATION_MOL_MOVE_IN); IList <Operation> listOper = operationRepository.GetByLikeCriteria(queryParams); if (listOper.Count != 2) { ModelState.AddModelError("Сторнирование перевода", "Не найдены операции по перемещению между МОЛ в достаточном кол-ве!"); } else { string docNumber = operationRepository.GetNextDocNumber(DataGlobals.OPERATION_STORAGE_TRANSFER_OUT, getCurrentEnterpriseId()); foreach (var item in listOper) { Operation stornoOper = new Operation(); MatPersonCardContent stornoMpcc = new MatPersonCardContent(); queryParams.Clear(); queryParams.Add("Operation", item); var l = matPersonCardContentRepository.GetByCriteria(queryParams); MatPersonCardContent findMpcc = null; if (l.Count > 0) { stornoOper.Quantity = -1 * Math.Abs(item.Quantity); stornoOper.DocDate = item.DocDate; stornoOper.DocNumber = docNumber; stornoOper.DocType = item.DocType; stornoOper.IsCorporate = item.IsCorporate; stornoOper.Motiv = item.Motiv; stornoOper.OperDate = item.OperDate; stornoOper.OperType = item.OperType; stornoOper.Organization = item.Organization; stornoOper.RefOperation = item; stornoOper.Storage = item.Storage; stornoOper.StorageName = item.StorageName; stornoOper.TransferOperation = item.TransferOperation; stornoOper.Wear = item.Wear; stornoOper.WorkerWorkplace = item.WorkerWorkplace; operationRepository.SaveOrUpdate(stornoOper); item.RefOperation = stornoOper; operationRepository.SaveOrUpdate(item); findMpcc = l[0]; stornoMpcc.MatPersonCardHead = findMpcc.MatPersonCardHead; stornoMpcc.Quantity = -1 * findMpcc.Quantity; stornoMpcc.Storage = findMpcc.Storage; stornoMpcc.Wear = findMpcc.Wear; stornoMpcc.Operation = stornoOper; stornoMpcc.OperType = findMpcc.OperType; stornoMpcc.OperDate = findMpcc.OperDate; matPersonCardContentRepository.SaveOrUpdate(stornoMpcc); } else { ModelState.AddModelError("Сторнирование операции", "У МОЛ не найдена номенклатура для сторнирования перевода!"); break; } } } } if (ModelState.IsValid) { if (oper.OperType.Id.In(DataGlobals.OPERATION_MOL_STORAGE_IN, /*Возврат дежурной на склад*/ DataGlobals.OPERATION_MOL_STORAGE_OUT, /*Выдача дежурной МОЛ со склада*/ DataGlobals.OPERATION_MOL_OUT, /*Списание дежурной с МОЛ*/ DataGlobals.OPERATION_MOL_WORKER_IN, /*Выдача дежурной от МОЛ работнику*/ DataGlobals.OPERATION_MOL_WORKER_RETURN /*Возврат дежурной от работника МОЛ*/)) { if (oper.OperType.Id.In(DataGlobals.OPERATION_MOL_STORAGE_IN, /*Возврат дежурной на склад*/ DataGlobals.OPERATION_MOL_STORAGE_OUT /*Выдача дежурной МОЛ со склада*/)) { DateTime maxStornoDate = remainRepository.GetMaxRemainDate(StorageNameId); maxStornoDate = remainRepository.GetActialRemainDate(StorageNameId, maxStornoDate); DateTime paramDateFrom = new DateTime(oper.OperDate.Year, oper.OperDate.Month, oper.OperDate.Day); paramDateFrom = paramDateFrom.AddMonths(1); paramDateFrom = paramDateFrom.AddDays(-1 * (paramDateFrom.Day - 1)); Remaind remain = null; if (maxStornoDate >= paramDateFrom) { queryParams.Clear(); queryParams.Add("RemaindDate", paramDateFrom); queryParams.Add("StorageName", oper.Storage.StorageName); queryParams.Add("Storage", oper.Storage); Dictionary <string, object> orderParams = new Dictionary <string, object>(); remain = remainRepository.FindOne(queryParams); //Если в остатках такой записи не оказалось, то создаем ее if (remain == null) { remain = new Remaind(); remain.RemaindDate = paramDateFrom; remain.Storage = oper.Storage; remain.StorageName = oper.Storage.StorageName; remain.Nomenclature = oper.Storage.Nomenclature; remain.Wear = int.Parse(oper.Storage.Wear); remain.NomBodyPartSize = oper.Storage.NomBodyPartSize; remain.Growth = oper.Storage.Growth; remain.Quantity = 0; } } if (remain != null) { remain.Quantity = remain.Quantity + (-1 * mpcc.Quantity); remainRepository.SaveOrUpdate(remain); } } Operation stornoOper = new Operation(); stornoOper.DocDate = oper.DocDate; string docNumber = ""; if (oper.OperType.Id == DataGlobals.OPERATION_MOL_STORAGE_IN || oper.OperType.Id == DataGlobals.OPERATION_MOL_WORKER_RETURN) { docNumber = operationRepository.GetNextDocNumber(DataGlobals.OPERATION_WORKER_RETURN, getCurrentEnterpriseId()); } else if (oper.OperType.Id == DataGlobals.OPERATION_MOL_STORAGE_OUT || oper.OperType.Id == DataGlobals.OPERATION_MOL_WORKER_IN) { docNumber = operationRepository.GetNextDocNumber(DataGlobals.OPERATION_WORKER_IN, getCurrentEnterpriseId()); } else if (oper.OperType.Id == DataGlobals.OPERATION_MOL_OUT) { docNumber = operationRepository.GetNextDocNumber(DataGlobals.OPERATION_MOL_OUT, getCurrentEnterpriseId()); } else { docNumber = oper.DocNumber; } stornoOper.DocNumber = docNumber; stornoOper.DocType = oper.DocType; stornoOper.Motiv = oper.Motiv; stornoOper.Note = oper.Note; stornoOper.OperDate = oper.OperDate; stornoOper.OperType = oper.OperType; stornoOper.Organization = oper.Organization; stornoOper.Partner = oper.Partner; stornoOper.Quantity = -1 * Math.Abs(oper.Quantity); stornoOper.Storage = oper.Storage; stornoOper.StorageName = oper.StorageName; stornoOper.Wear = oper.Wear; stornoOper.WorkerWorkplace = oper.WorkerWorkplace; stornoOper.RefOperation = oper; operationRepository.SaveOrUpdate(stornoOper); oper.RefOperation = stornoOper; operationRepository.SaveOrUpdate(oper); MatPersonCardContent stornoMpcc = new MatPersonCardContent(); stornoMpcc.MatPersonCardHead = mpcc.MatPersonCardHead; stornoMpcc.Quantity = -1 * mpcc.Quantity; stornoMpcc.Storage = mpcc.Storage; stornoMpcc.Wear = mpcc.Wear; stornoMpcc.Operation = stornoOper; stornoMpcc.OperType = mpcc.OperType; stornoMpcc.OperDate = mpcc.OperDate; matPersonCardContentRepository.SaveOrUpdate(stornoMpcc); } } } //Если операция связана с карточкой else { WorkerCardContent wcc = null; if (oper.OperType.Id == DataGlobals.OPERATION_WORKER_IN || oper.OperType.Id == DataGlobals.OPERATION_STORAGE_TRANSFER_IN) { queryParams.Add("Operation", oper); } else { queryParams.Add("OperReturn", oper); } wcc = workerCardContentRepository.FindOne(queryParams); if (wcc == null) { ModelState.AddModelError("Сторнирование операции", "Не найдена номенклатура на карточке. Сторнирование не возможно! "); } Remaind remain = null; Storage stor = null; if (ModelState.IsValid) { DateTime maxStornoDate = remainRepository.GetMaxRemainDate(StorageNameId); maxStornoDate = remainRepository.GetActialRemainDate(StorageNameId, maxStornoDate); DateTime paramDateFrom = new DateTime(oper.OperDate.Year, oper.OperDate.Month, oper.OperDate.Day); paramDateFrom = paramDateFrom.AddMonths(1); paramDateFrom = paramDateFrom.AddDays(-1 * (paramDateFrom.Day - 1)); if (maxStornoDate >= paramDateFrom) { queryParams.Clear(); queryParams.Add("RemaindDate", paramDateFrom); //DateTime paramDateTo = new DateTime(oper.OperDate.Year, oper.OperDate.Month, oper.OperDate.Day); //paramDateTo = paramDateTo.AddMonths(1); //paramDateTo = paramDateTo.AddDays(-1 * paramDateTo.Day); //queryParams.Add("[<=]RemaindDate", paramDateTo); queryParams.Add("StorageName", oper.Storage.StorageName); queryParams.Add("Storage", oper.Storage); Dictionary <string, object> orderParams = new Dictionary <string, object>(); remain = remainRepository.FindOne(queryParams); //Если в остатках такой записи не оказалось, то создаем ее if (remain == null) { remain = new Remaind(); remain.RemaindDate = paramDateFrom; remain.Storage = oper.Storage; remain.StorageName = oper.Storage.StorageName; remain.Nomenclature = oper.Storage.Nomenclature; remain.Wear = int.Parse(oper.Storage.Wear); remain.NomBodyPartSize = oper.Storage.NomBodyPartSize; remain.Growth = oper.Storage.Growth; remain.Quantity = 0; } } stor = storageRepository.Get(oper.Storage.Id); //Сторнируем выдачу работнику if (oper.OperType.Id == DataGlobals.OPERATION_WORKER_IN) { if (wcc.OperReturn != null) { ModelState.AddModelError("Сторнирование выдачи", "У работника был возврат этой номенклатуры!"); } if ((wcc.Quantity - oper.Quantity) < 0) { ModelState.AddModelError("Сторнирование выдачи", "У работника на руках меньше кол-во номенклатуры!"); } if (ModelState.IsValid) { wcc.Quantity = wcc.Quantity - oper.Quantity; stor.Quantity = stor.Quantity + oper.Quantity; if (remain != null) { remain.Quantity = remain.Quantity + oper.Quantity; } } } //Сторнируем возврат работником if (oper.OperType.Id == DataGlobals.OPERATION_WORKER_RETURN) { if (((stor.Quantity - oper.Quantity) < 0) & (oper.Wear != "0")) { ModelState.AddModelError("Сторнирование возврата", "На складе не хватает заданной номенклатуры!"); } else { wcc.OperReturn = null; wcc.EndDate = Null_Date; wcc.Quantity = wcc.Quantity + oper.Quantity; // Если не утиль, то обновляем склад if (oper.Wear != "0") { stor.Quantity = stor.Quantity - oper.Quantity; } } if (remain != null) { if (((remain.Quantity - oper.Quantity) < 0) & (oper.Wear != "0")) { ModelState.AddModelError("Сторнирование возврата", "После этой операции произошло снятие остатков в конце месяца. В этих остатках не хватает кол-ва!"); } else { wcc.Quantity = wcc.Quantity + oper.Quantity; // Если не утиль, то обновляем склад if (oper.Wear != "0") { stor.Quantity = stor.Quantity - oper.Quantity; } } } } //Сторнируем списание с работника if (oper.OperType.Id == DataGlobals.OPERATION_WORKER_OUT || oper.OperType.Id == DataGlobals.OPERATION_WORKER_OUT_TIME) { if (wcc.Quantity == 0) { wcc.OperReturn = null; wcc.EndDate = Null_Date; } wcc.Quantity = wcc.Quantity + oper.Quantity; } //Сторнируем перевод работника состояние на личных карточках if (oper.OperType.Id == DataGlobals.OPERATION_STORAGE_TRANSFER_IN || oper.OperType.Id == DataGlobals.OPERATION_STORAGE_TRANSFER_OUT) { queryParams.Clear(); if (oper.OperType.Id == DataGlobals.OPERATION_STORAGE_TRANSFER_IN) { queryParams.Add("Operation", oper); wcc = workerCardContentRepository.FindOne(queryParams); workerCardContentRepository.Delete(wcc); queryParams.Clear(); queryParams.Add("OperReturn", operTransfer); wcc = workerCardContentRepository.FindOne(queryParams); if (wcc.Quantity == 0) { wcc.OperReturn = null; wcc.EndDate = Null_Date; } wcc.Quantity = wcc.Quantity + oper.Quantity; } if (oper.OperType.Id == DataGlobals.OPERATION_STORAGE_TRANSFER_OUT) { queryParams.Clear(); queryParams.Add("Operation", operTransfer); wcc = workerCardContentRepository.FindOne(queryParams); workerCardContentRepository.Delete(wcc); queryParams.Clear(); queryParams.Add("OperReturn", oper); wcc = workerCardContentRepository.FindOne(queryParams); if (wcc.Quantity == 0) { wcc.OperReturn = null; wcc.EndDate = Null_Date; } wcc.Quantity = wcc.Quantity + oper.Quantity; } } } if (ModelState.IsValid) { workerCardContentRepository.SaveOrUpdate(wcc); //Если не списание с работника if (oper.OperType.Id != DataGlobals.OPERATION_WORKER_OUT) { // Если не утиль, то обновляем склад if (oper.Wear != "0") { storageRepository.SaveOrUpdate(stor); } } Operation stornoOper = new Operation(); stornoOper.DocDate = oper.DocDate; // stornoOper.DocNumber = oper.DocNumber; string docNumber = ""; if (oper.OperType.Id == DataGlobals.OPERATION_WORKER_RETURN || oper.OperType.Id == DataGlobals.OPERATION_WORKER_IN) { docNumber = operationRepository.GetNextDocNumber(oper.OperType.Id, getCurrentEnterpriseId()); } else if (oper.OperType.Id == DataGlobals.OPERATION_STORAGE_TRANSFER_IN || oper.OperType.Id == DataGlobals.OPERATION_STORAGE_TRANSFER_OUT) { docNumber = operationRepository.GetNextDocNumber(DataGlobals.OPERATION_STORAGE_TRANSFER_OUT, getCurrentEnterpriseId()); } else { docNumber = oper.DocNumber; } stornoOper.DocNumber = docNumber; stornoOper.DocType = oper.DocType; stornoOper.Motiv = oper.Motiv; stornoOper.Note = oper.Note; stornoOper.OperDate = oper.OperDate; stornoOper.OperType = oper.OperType; stornoOper.Organization = oper.Organization; stornoOper.Partner = oper.Partner; stornoOper.Quantity = -1 * oper.Quantity; stornoOper.Storage = oper.Storage; stornoOper.StorageName = oper.StorageName; stornoOper.Wear = oper.Wear; stornoOper.WorkerWorkplace = oper.WorkerWorkplace; stornoOper.RefOperation = oper; stornoOper.TransferOperation = oper; operationRepository.SaveOrUpdate(stornoOper); oper.RefOperation = stornoOper; oper.TransferOperation = stornoOper; operationRepository.SaveOrUpdate(oper); // Если операция перевода, то сторнируем связанную с ней if (operTransfer != null) { Operation stornoTranserOper = new Operation(); stornoTranserOper.DocDate = oper.DocDate; // stornoOper.DocNumber = oper.DocNumber; // Номер документа сторно будет новый, такой же как у первой операции stornoTranserOper.DocNumber = docNumber; stornoTranserOper.DocType = operTransfer.DocType; stornoTranserOper.Motiv = operTransfer.Motiv; stornoTranserOper.Note = operTransfer.Note; stornoTranserOper.OperDate = operTransfer.OperDate; stornoTranserOper.OperType = operTransfer.OperType; stornoTranserOper.Organization = operTransfer.Organization; stornoTranserOper.Partner = operTransfer.Partner; stornoTranserOper.Quantity = -1 * operTransfer.Quantity; stornoTranserOper.Storage = operTransfer.Storage; stornoTranserOper.StorageName = operTransfer.StorageName; stornoTranserOper.Wear = operTransfer.Wear; stornoTranserOper.WorkerWorkplace = operTransfer.WorkerWorkplace; stornoTranserOper.RefOperation = operTransfer; operationRepository.SaveOrUpdate(stornoTranserOper); operTransfer.RefOperation = stornoTranserOper; operationRepository.SaveOrUpdate(operTransfer); } //Если не списание с работника if (oper.OperType.Id == DataGlobals.OPERATION_WORKER_IN || oper.OperType.Id == DataGlobals.OPERATION_WORKER_RETURN) { if (remain != null) { remainRepository.SaveOrUpdate(remain); } } } } }