Пример #1
0
        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);
        }
Пример #2
0
        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);
                }
            }
        }
Пример #3
0
        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);
                }
            }
        }
Пример #4
0
 public static Remaind rebuildRemain(Remaind inRemain)
 {
     return(rebuildRemain(inRemain, null));
 }
Пример #5
0
        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);
                        }
                    }
                }
            }
        }