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); } } } } }
// public ActionResult Update(string id) //public ActionResult Update(WorkerNorma workerNorma) public ActionResult Update([Bind(Prefix = "updated")] IEnumerable <WorkerNorma> workerNormas) { //int workerWorkplaceId = (int)HttpContext.Cache.Get("workerWorkplaceId"); int workerWorkplaceId = (int)Session["workerWorkplaceId"]; string docNumber = operationRepository.GetNextDocNumber(DataGlobals.OPERATION_WORKER_RETURN, getCurrentEnterpriseId()); int? motivId = null; //DateTime? docDate = null; DateTime?operDate = null; // перове число текущего месяца DateTime firstDay = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1); // первое число предыдущего месяца DateTime minDate = firstDay.AddMonths(-1); Dictionary <string, object> query = new Dictionary <string, object>(); query.Add("Id", workerWorkplaceId); WorkerWorkplace workerWorkplace = workerWorkplaceRepository.Get(workerWorkplaceId); query.Clear(); query.Add("WorkerWorkplace", workerWorkplace); WorkerCardHead workerCardHead = workerCardRepository.FindOne(query); if (workerNormas != null) { int i = -1; foreach (var workerNorma in workerNormas) { i++; if (i == 0) { if (workerNorma.OperDate != null) { operDate = workerNorma.OperDate.Value; if (DateTime.Today > operDate) { operDate = operDate.Value.AddHours(21).AddMinutes(0).AddSeconds(0); } else { operDate = operDate.Value.AddHours(DateTime.Now.Hour).AddMinutes(DateTime.Now.Minute).AddSeconds(DateTime.Now.Second); } } motivId = workerNorma.MotivId; } if (workerNorma.PutQuantity <= 0) { continue; } //NormaContent normaContent = normaContentRepository.Get(workerNorma.NormaContentId); WorkerCardContent workerCardContentPresent = getWorkerCard(workerNorma.Id, workerCardHead); //workerCardContent.Storage = workerNorma.WorkerCardContent.Storage; // if (workerCardContentPresent.Quantity != workerNorma.PutQuantity) // ModelState.AddModelError("updated[" + i + "].StorageName", "Списать можно только столько сколько есть на руках"); //if (operDate != null && (DateTime.Now < operDate || minDate > operDate)) if (operDate != null && DateTime.Now < operDate) { ModelState.AddModelError(operDate + ": ", "Дата операции должна быть не больше текущей даты и не меньше 1-го числа предыдущего месяца"); } if (operDate < workerNorma.ReceptionDate) { ModelState.AddModelError(operDate + ": ", "Дата возврата не может быть меньше даты выдачи"); } if (firstDay > operDate) { // проверка на закрытие периода string periodIsClosed = getConfigParamValue(configRepository, "periodIsClosed", getCurrentEnterpriseId()); string periodDateStr = getConfigParamValue(configRepository, "periodDate", getCurrentEnterpriseId()); DateTime periodDate; DateTime.TryParseExact(periodDateStr, DataGlobals.DATE_FORMAT_FULL_YEAR, null, System.Globalization.DateTimeStyles.None, out periodDate); if (periodIsClosed != null && periodIsClosed.Equals("1") && periodDate > operDate) { ModelState.AddModelError(operDate + ": ", "Период закрыт для изменений"); } } if (workerNorma.PutQuantity <= 0) { ModelState.AddModelError(workerCardContentPresent.Storage.Nomenclature.Name, "Вернуть можно кол-во больше 0"); } if (workerNorma.PutQuantity > workerCardContentPresent.Quantity) { ModelState.AddModelError(workerCardContentPresent.Storage.Nomenclature.Name, "Вернуть можно не больше чем есть на руках"); } if (workerNorma.Wear == null) { ModelState.AddModelError(workerCardContentPresent.Storage.Nomenclature.Name, "Введите износ"); } //if (string.IsNullOrEmpty(docNumber) || docDate == null) // ModelState.AddModelError("updated[" + i + "].StorageName", "Номер и дата документа должны быть заполнены"); } if (ModelState.IsValid) { foreach (var workerNorma in workerNormas) { if (workerNorma.PutQuantity <= 0) { continue; } WorkerCardContent workerCardContentPresent = getWorkerCard(workerNorma.Id, workerCardHead); //workerCardContentPresent.Storage = null; Operation oper = new Operation(); oper.OperDate = operDate.Value; oper.OperType = operTypeRepository.Get(DataGlobals.OPERATION_WORKER_RETURN); oper.Organization = organizationRepository.Get(workerWorkplace.RootOrganization); oper.Quantity = workerNorma.PutQuantity; //oper.Storage = workerCardContentPresent.Storage; oper.Wear = workerNorma.Wear; oper.DocNumber = docNumber; oper.DocDate = oper.OperDate; oper.Motiv = motivRepository.Get(motivId.Value); oper.WorkerWorkplace = workerWorkplace; oper.GiveOperation = workerCardContentPresent.GiveOperation; //workerCardContentPresent.Operation = oper; //workerCardContentPresent.Quantity -= oper.Quantity; if (workerNorma.PutQuantity == workerCardContentPresent.Quantity) { workerCardHead.WorkerCardContents.Remove(workerCardContentPresent); } // workerCardContentRepository.Delete(workerCardContentPresent); //workerCardRepository.SaveOrUpdate(workerCardHead); // если не утиль, ищем позицию с таким износом на складе //if (int.Parse(workerNorma.Wear) > 0) //{ query.Clear(); query.Add("Nomenclature", workerCardContentPresent.Storage.Nomenclature); if (workerCardContentPresent.Storage.NomBodyPartSize != null) { query.Add("NomBodyPartSize", workerCardContentPresent.Storage.NomBodyPartSize); } if (workerCardContentPresent.Storage.Growth != null) { query.Add("Growth", workerCardContentPresent.Storage.Growth); } query.Add("StorageName", workerCardContentPresent.Storage.StorageName); if (int.Parse(workerNorma.Wear) > 0) { query.Add("Wear", workerNorma.Wear); } IList <Storage> storages = storageRepository.GetByCriteria(query); Storage storage = null; if (storages.Count > 0) { storage = storages[0]; if (int.Parse(workerNorma.Wear) > 0) { storage.Quantity += workerNorma.PutQuantity; } } else { storage = new Storage(); storage.Growth = workerCardContentPresent.Storage.Growth; storage.NomBodyPartSize = workerCardContentPresent.Storage.NomBodyPartSize; storage.Nomenclature = workerCardContentPresent.Storage.Nomenclature; storage.StorageName = workerCardContentPresent.Storage.StorageName; storage.Wear = workerNorma.Wear; if (int.Parse(workerNorma.Wear) > 0) { storage.Quantity = workerNorma.PutQuantity; } else { storage.Quantity = 0; } } storageRepository.SaveOrUpdate(storage); oper.Storage = storage; operationRepository.SaveOrUpdate(oper); if (workerNorma.PutQuantity == workerCardContentPresent.Quantity) { workerCardContentPresent.OperReturn = oper; workerCardContentPresent.Quantity = 0; workerCardContentPresent.EndDate = oper.OperDate; } else { workerCardContentPresent.Quantity = workerCardContentPresent.Quantity - workerNorma.PutQuantity; WorkerCardContent wcc = new WorkerCardContent(); wcc.Quantity = 0; wcc.StartDate = workerCardContentPresent.StartDate; wcc.EndDate = oper.OperDate; wcc.WorkerCardHead = workerCardContentPresent.WorkerCardHead; wcc.Storage = workerCardContentPresent.Storage; wcc.Operation = workerCardContentPresent.Operation; wcc.OperReturn = oper; wcc.NormaContent = workerCardContentPresent.NormaContent; wcc.GiveOperation = workerCardContentPresent.GiveOperation; workerCardContentRepository.SaveOrUpdate(wcc); } workerCardContentRepository.SaveOrUpdate(workerCardContentPresent); if (firstDay > operDate) { //пересчитываем остатки rebuildRemaind(operationRepository, remainsRepository, storage, minDate, firstDay.AddSeconds(-1), firstDay); } //} } } } return(Select(workerWorkplaceId, (string)Session["workerWorkplaceText"], (string)Session["storageNameId"])); }
public ActionResult _TransferWorkerCard(int?workerWorkplaceId, int storageNameId, string listId, Boolean outNorma, string OperDate) { DateTime operDate; DateTime.TryParseExact(OperDate, DataGlobals.DATE_FORMAT, null, System.Globalization.DateTimeStyles.None, out operDate); ResultState resultState = new ResultState(); resultState.Status = ResultState.OK; if (workerWorkplaceId != null) { Dictionary <string, object> query = new Dictionary <string, object>(); Dictionary <string, object> order = new Dictionary <string, object>(); query.Add("Worker.Id", workerWorkplaceId); query.Add("IsActive", true); order.Add("Storage.StorageName.Id", storageNameId); //Выбираем активные рабочие места IList <WorkerWorkplace> workerWorkplaces = workerWorkplaceRepository.GetByLikeCriteria(query); if (workerWorkplaces.Count == 1) { WorkerWorkplace ww = workerWorkplaces[0]; //Выбираем активные рабочие места // Запрет на одевание работника в салоне к которому он не приписан. Пока закомментировала, т.к. не уверена, что не будет последствий /* * if (ww.Organization.StorageName.Id != storageNameId) * { * resultState.Status = ResultState.ERROR; * resultState.setMessage("НЕЛЬЗЯ ВЫПОЛНИТЬ ПЕРЕВОД!!! Работник приписан к складу " + ww.Organization.StorageName.StorageNumber); * } */ string periodDateStr = getConfigParamValue(configRepository, "periodDate", getCurrentEnterpriseId()); string periodIsClosed = getConfigParamValue(configRepository, "periodIsClosed", getCurrentEnterpriseId()); DateTime periodDate; DateTime.TryParseExact(periodDateStr, DataGlobals.DATE_FORMAT_FULL_YEAR, null, System.Globalization.DateTimeStyles.None, out periodDate); // проверка на закрытие периода if (periodIsClosed != null && periodIsClosed.Equals("1") && periodDate > operDate) { resultState.Status = ResultState.ERROR; resultState.setMessage(OperDate + ": Период закрыт для изменений"); } if (resultState.Status == ResultState.OK) { query.Clear(); query.Add("WorkerWorkplace", ww); WorkerCardHead newWorkerCardHead = workerCardRepository.FindOne(query); if (newWorkerCardHead == null) { newWorkerCardHead = new WorkerCardHead(); newWorkerCardHead.WorkerWorkplace = ww; } query.Clear(); query.Add("Organization", ww.Organization); query.Add("Norma.Organization.Id", int.Parse(getCurrentEnterpriseId())); query.Add("Norma.IsActive", true); IList <NormaOrganization> normaOrganizations = normaOrganizationRepository.GetByCriteria(query); IList <NomenclatureSimple> list = getNomenclaturesByParam(listId); string docNumber = "00000"; // Убрала ниже, чтобы можно было изменять номер документа docNumber = operationRepository.GetNextDocNumber(DataGlobals.OPERATION_STORAGE_TRANSFER_OUT, getCurrentEnterpriseId()); int?skladId = null; foreach (var item in list) { ResultState listResultState = new ResultState(); listResultState.Status = ResultState.OK; WorkerCardContent oldWorkerCardContent = workerCardContentRepository.Get(item.Id); if (skladId != null && skladId != oldWorkerCardContent.Storage.StorageName.Id) { docNumber = operationRepository.GetNextDocNumber(DataGlobals.OPERATION_STORAGE_TRANSFER_OUT, getCurrentEnterpriseId()); } if (oldWorkerCardContent.StartDate >= operDate) { listResultState.Status = ResultState.ERROR; listResultState.setMessage(item.Name + " Дата перевода раньше даты выдачи!!! Введите текущую дату!"); resultState.Status = ResultState.ERROR; resultState.setMessage(item.Name + " Дата перевода раньше даты выдачи!!! Введите текущую дату!"); } NormaContent newNormaContent = GetNewNormaContent(normaOrganizations, item.GroupId); // Если на новом рабочем месте номенклатура не подходит по норме и выбрана опция //Ставим старую норму //Закомментировано, т.к. по просьбе УПУ не нужно переносить на руки, то что не по норме if (newNormaContent == null && outNorma == true) { newNormaContent = oldWorkerCardContent.NormaContent; } // if (newNormaContent != null ) if (newNormaContent == null && outNorma != true) { listResultState.Status = ResultState.ERROR; listResultState.setMessage(item.Name + " НЕ СООТВЕТСТВУЕТ новой норме. Выполните ВОЗВРАТ или СПИСАНИЕ по акту!"); resultState.Status = ResultState.ERROR; resultState.setMessage(item.Name + " НЕ СООТВЕТСТВУЕТ новой норме. Выполните ВОЗВРАТ или СПИСАНИЕ по акту!"); } else { Storage storageTo = null; //Выбранный склад и склад номенклатуры совпадают if (oldWorkerCardContent.Storage.StorageName.Id == storageNameId) { storageTo = oldWorkerCardContent.Storage; } //Выбранный склад и склад номенклатуры не совпадают else { //Пытаемся найти номенклатуру на другом складе StorageName storageName = storageNameRepository.Get(storageNameId); if (storageName == null) { listResultState.Status = ResultState.ERROR; listResultState.setMessage("В справочнике не найден склад с идентификатором " + storageNameId + "!"); resultState.Status = ResultState.ERROR; resultState.setMessage("В справочнике не найден склад с идентификатором " + storageNameId + "!"); } if (listResultState.Status == ResultState.OK) { query.Clear(); query.Add("Nomenclature", oldWorkerCardContent.Storage.Nomenclature); query.Add("StorageName", storageName); if (oldWorkerCardContent.Storage.Wear == null) { query.Add("[]Wear", ""); } else { query.Add("Wear", oldWorkerCardContent.Storage.Wear); } if (oldWorkerCardContent.Storage.Growth == null) { query.Add("[]Growth", ""); } else { query.Add("Growth", oldWorkerCardContent.Storage.Growth); } if (oldWorkerCardContent.Storage.NomBodyPartSize == null) { query.Add("[]NomBodyPartSize", ""); } else { query.Add("NomBodyPartSize", oldWorkerCardContent.Storage.NomBodyPartSize); } IList <Storage> storages = storageRepository.GetByLikeCriteria(query); if (storages.Count > 0) { storageTo = storages[0]; } else { //На новом складе не нашлась номенклатура storageTo = new Storage(); storageTo.StorageName = storageName; storageTo.Nomenclature = oldWorkerCardContent.Storage.Nomenclature; storageTo.Quantity = 0; storageTo.Price = oldWorkerCardContent.Storage.Price; storageTo.Growth = oldWorkerCardContent.Storage.Growth; storageTo.NomBodyPartSize = oldWorkerCardContent.Storage.NomBodyPartSize; storageTo.Wear = oldWorkerCardContent.Storage.Wear; storageRepository.SaveOrUpdate(storageTo); } } } // if (resultState.Status == ResultState.OK) if (listResultState.Status == ResultState.OK) { //Создаем операцию на перевод по старому месту работы Operation oldOperation = new Operation(); oldOperation.WorkerWorkplace = oldWorkerCardContent.WorkerCardHead.WorkerWorkplace; oldOperation.OperDate = operDate; //DateTime.Now; oldOperation.Quantity = oldWorkerCardContent.Quantity; oldOperation.OperType = operTypeRepository.Get(DataGlobals.OPERATION_STORAGE_TRANSFER_OUT); oldOperation.Organization = organizationRepository.Get(int.Parse(getCurrentEnterpriseId())); oldOperation.DocNumber = docNumber; oldOperation.GiveOperation = oldWorkerCardContent.GiveOperation; //oldOperation.DocDate= query.Clear(); query.Add("OperType", oldOperation.OperType); IList <Motiv> motivs = motivRepository.GetByLikeCriteria(query); if (motivs.Count > 0) { oldOperation.Motiv = motivs[0]; } oldOperation.Storage = oldWorkerCardContent.Storage; //Создаем операцию на перевод по новому месту работы Operation newOperation = new Operation(); newOperation.WorkerWorkplace = ww; newOperation.OperDate = operDate; //DateTime.Now; newOperation.Quantity = oldWorkerCardContent.Quantity; newOperation.OperType = operTypeRepository.Get(DataGlobals.OPERATION_STORAGE_TRANSFER_IN); newOperation.Organization = organizationRepository.Get(int.Parse(getCurrentEnterpriseId())); newOperation.DocNumber = docNumber; newOperation.GiveOperation = oldWorkerCardContent.GiveOperation; //newOperation.DocDate= motivs.Clear(); query.Clear(); query.Add("OperType", newOperation.OperType); motivs = motivRepository.GetByLikeCriteria(query); if (motivs.Count > 0) { newOperation.Motiv = motivs[0]; } newOperation.Storage = storageTo; newOperation.TransferOperation = oldOperation; oldOperation.TransferOperation = newOperation; operationRepository.SaveOrUpdate(oldOperation); operationRepository.SaveOrUpdate(newOperation); //Создаем новую карточку WorkerCardContent newWorkerCardContent = new WorkerCardContent(); newWorkerCardContent.WorkerCardHead = newWorkerCardHead; newWorkerCardContent.Storage = storageTo; newWorkerCardContent.Quantity = oldWorkerCardContent.Quantity; newWorkerCardContent.Operation = newOperation; newWorkerCardContent.StartDate = oldWorkerCardContent.StartDate; newWorkerCardContent.UsePeriod = oldWorkerCardContent.UsePeriod; newWorkerCardContent.GiveOperation = oldWorkerCardContent.GiveOperation; //Проставляем новую норму!!! newWorkerCardContent.NormaContent = newNormaContent; //Обнуляем старую карточку oldWorkerCardContent.Quantity = 0; oldWorkerCardContent.EndDate = operDate; //DateTime.Now; oldWorkerCardContent.OperReturn = oldOperation; //Сохраняем новую и старую карточки workerCardContentRepository.SaveOrUpdate(oldWorkerCardContent); workerCardContentRepository.SaveOrUpdate(newWorkerCardContent); } } skladId = oldWorkerCardContent.Storage.StorageName.Id; } } } else { //У человека несколько активных рабочих мест или рабочее место не найдено resultState.Status = ResultState.ERROR; resultState.setMessage("У человека больше одного рабочего места или рабочее место не найдено!"); } } return(Json(resultState)); }