| | | 1 | | using Microsoft.EntityFrameworkCore; |
| | | 2 | | using Microsoft.Extensions.Logging; |
| | | 3 | | using System; |
| | | 4 | | using System.Collections.Generic; |
| | | 5 | | using System.Linq; |
| | | 6 | | using System.Linq.Expressions; |
| | | 7 | | using System.Reflection; |
| | | 8 | | using System.Text; |
| | | 9 | | using System.Threading.Tasks; |
| | | 10 | | using SVETA.Api.Helpers; |
| | | 11 | | using WinSolutions.Sveta.Server.Data.DataModel.Contexts; |
| | | 12 | | using WinSolutions.Sveta.Server.Data.DataModel.Entities; |
| | | 13 | | using WinSolutions.Sveta.Server.Data.DataModel.Kinds; |
| | | 14 | | using WinSolutions.Sveta.Server.Domain; |
| | | 15 | | using WinSolutions.Sveta.Server.Services.Interfaces; |
| | | 16 | | using WinSolutions.Sveta.Common; |
| | | 17 | | |
| | | 18 | | namespace WinSolutions.Sveta.Server.Services.Implements |
| | | 19 | | { |
| | | 20 | | public class MovementService : SvetaServiceBase, IMovementService |
| | | 21 | | { |
| | | 22 | | private readonly SvetaDbContext _db; |
| | | 23 | | private readonly ILogger<MovementService> _logger; |
| | | 24 | | public MovementService(SvetaDbContext db, ILogger<MovementService> logger, IAuthenticationService authentication |
| | 144 | 25 | | : base(authenticationService) |
| | 144 | 26 | | { |
| | 144 | 27 | | _db = db; |
| | 144 | 28 | | _logger = logger; |
| | 144 | 29 | | } |
| | | 30 | | |
| | | 31 | | /// <summary> |
| | | 32 | | /// Возвращает отфильтрованный и отсортированный список документов |
| | | 33 | | /// </summary> |
| | | 34 | | /// <param name="state"></param> |
| | | 35 | | /// <param name="documentNumber">Номер документа</param> |
| | | 36 | | /// <param name="customerId">Идентификтор заказчика</param> |
| | | 37 | | /// <param name="receiverId">Идентификтор получателя</param> |
| | | 38 | | /// <param name="supplierId">Идентификтор поставщика</param> |
| | | 39 | | /// <param name="fromDate">Дата начала отбора </param> |
| | | 40 | | /// <param name="toDate">Дата окончания отбора</param> |
| | | 41 | | /// <param name="kind">Тип документа</param> |
| | | 42 | | /// <param name="contragentBuyerFilter">Поиск по контрагенту покупателю</param> |
| | | 43 | | /// <param name="page">Страница</param> |
| | | 44 | | /// <param name="limit">Количество для отбора - макс 100, если null то вернет все записи</param> |
| | | 45 | | /// <param name="sort">сортировка по умолчанию по id - id|desc,created_on,created_on|desc,state,state|desc,statu |
| | | 46 | | /// <param name="excludedStatuses"></param> |
| | | 47 | | /// <param name="status"></param> |
| | | 48 | | /// <returns>Task<PaginatedData<List<Movement>>></returns> |
| | | 49 | | public async Task<PaginatedData<List<Movement>>> GetFilterMovements(long customerId = 0, long receiverId = 0, lo |
| | | 50 | | DateTime toDate = default, MovementType kind = null, MovementStatus status = null, RecordsState state = null |
| | | 51 | | string sort = default, long[] excludedStatuses = null, string contragentBuyerFilter = default, long senderId |
| | 4 | 52 | | { |
| | 4 | 53 | | var movements = PrepareListMovement(kind); |
| | 4 | 54 | | if (movements == null) |
| | 0 | 55 | | return await Task.FromResult(new PaginatedData<List<Movement>>()); |
| | | 56 | | |
| | 4 | 57 | | int total = customerId != 0 || supplierId != 0 || excludedStatuses != null |
| | 4 | 58 | | ? await FilterMovement(movements, customerId, 0, supplierId, excludedStatuses: excludedStatuses) |
| | 4 | 59 | | .CountAsync() |
| | 4 | 60 | | : await movements?.CountAsync(); |
| | | 61 | | |
| | 4 | 62 | | movements = FilterMovement(movements, customerId, receiverId, supplierId, fromDate, toDate, status, |
| | 4 | 63 | | state, documentNumber, excludedStatuses, contragentBuyerFilter, senderId: senderId); |
| | | 64 | | |
| | 4 | 65 | | int filteredCount = movements != null |
| | 4 | 66 | | ? await movements?.CountAsync() |
| | 4 | 67 | | : 0; |
| | 4 | 68 | | movements = SortMovement(movements, sort?.ToLower()); |
| | 4 | 69 | | if(limit != null) |
| | 4 | 70 | | movements = movements.Skip((page < 2 ? 0 : page-1) * (int)limit).Take((int)limit); |
| | 4 | 71 | | PaginatedData<List<Movement>> paginated = new PaginatedData<List<Movement>> |
| | 4 | 72 | | { |
| | 4 | 73 | | TotalCount = total, |
| | 4 | 74 | | TotalFilteredCount = filteredCount, |
| | 4 | 75 | | Result = await movements.ToListAsync() |
| | 4 | 76 | | }; |
| | | 77 | | // позиции документов заполняем уже для конечного результата, чтобы побыстрее |
| | 4 | 78 | | FillMovementsItems(paginated.Result); |
| | | 79 | | |
| | 4 | 80 | | return await Task.FromResult(paginated); |
| | 4 | 81 | | } |
| | | 82 | | |
| | | 83 | | /// <summary> |
| | | 84 | | /// Для переданных документов заполняет их позиции. Используется для ускорения работы с базой |
| | | 85 | | /// </summary> |
| | | 86 | | /// <param name="result"></param> |
| | | 87 | | public void FillMovementsItems(List<Movement> result) |
| | 5 | 88 | | { |
| | 8 | 89 | | var items = GetMovementItemsByMovements(result.Select(x => x.Id).ToList()); |
| | 21 | 90 | | foreach(var mov in result) |
| | 3 | 91 | | { |
| | 3 | 92 | | mov.Items = items[mov.Id]; |
| | 3 | 93 | | } |
| | 5 | 94 | | } |
| | | 95 | | |
| | | 96 | | /// <summary> |
| | | 97 | | /// Возвращает список документов без пагинации |
| | | 98 | | /// </summary> |
| | | 99 | | /// <param name="customerId">идентификатор контрагента заказчика - по умолчанию 0, поиск по всем</param> |
| | | 100 | | /// <param name="receiverId">идентификатор департамента магазина заказчика- по умолчанию 0, поиск по всем</param |
| | | 101 | | /// <param name="supplierId">идентификатор контрагента поставщика- по умолчанию 0, поиск по всем</param> |
| | | 102 | | /// <param name="fromDate">дата начала отбора по умолчанию все</param> |
| | | 103 | | /// <param name="toDate">дата окончания отбора по умолчанию все</param> |
| | | 104 | | /// <param name="kind">тип документа для поиска </param> |
| | | 105 | | /// <param name="status">статус документа для поиска</param> |
| | | 106 | | /// <param name="state">состояние записи документа</param> |
| | | 107 | | /// <param name="sort">тип сортировки - сортировка по умолчанию по id - id|desc,created_on,created_on|desc,state |
| | | 108 | | /// <param name="excludedStatuses">массив с идентификаторами статусов для исключения из выдачи</param> |
| | | 109 | | /// <returns>IQueryable<Movement></returns> |
| | | 110 | | public IQueryable<Movement> GetFilterMovementsWithoutPagination(long customerId = 0, |
| | | 111 | | long receiverId = 0, |
| | | 112 | | long supplierId = 0, DateTime fromDate = default, |
| | | 113 | | DateTime toDate = default, MovementType kind = null, MovementStatus status = null, |
| | | 114 | | RecordsState state = null, string sort = default, long[] excludedStatuses = null) => |
| | 45 | 115 | | FilterMovement(PrepareListMovement(kind).AsNoTracking(), customerId, receiverId, supplierId, fromDate, |
| | 45 | 116 | | toDate, status, state, sort, excludedStatuses); |
| | | 117 | | |
| | | 118 | | /// <summary> |
| | | 119 | | /// Возвращает заявки созданные на основании идентификатора переданного в параметре |
| | | 120 | | /// </summary> |
| | | 121 | | /// <param name="parentId">идентификатор документа родителя</param> |
| | | 122 | | /// <param name="kind">Тип возращаемых документов</param> |
| | | 123 | | /// <param name="statusId">Статус для поиска - 0 для всех</param> |
| | | 124 | | /// <returns>Task<List<Movement>></returns> |
| | | 125 | | public async Task<List<Movement>> GetMovementsByParent(long parentId, MovementType kind, long statusId) => |
| | 82 | 126 | | await PrepareMovement(kind) |
| | 82 | 127 | | .Where(d => d.ParentId == parentId) |
| | 82 | 128 | | .Where(d => statusId == 0 || d.MovementStatus.Id == statusId) |
| | 82 | 129 | | .ToListAsync(); |
| | | 130 | | |
| | | 131 | | /// <summary> |
| | | 132 | | /// Возвращает документы по родителю с минимальным количеством инклюдов |
| | | 133 | | /// </summary> |
| | | 134 | | /// <param name="parentId">Идентификатор родительского документа</param> |
| | | 135 | | /// <param name="kind">Тип возвращаемых документов</param> |
| | | 136 | | /// <param name="statusId">Статус документов для поиска</param> |
| | | 137 | | /// <returns>Task<List<Movement>></returns> |
| | | 138 | | public async Task<List<Movement>> GetLiteMovementByParent(long parentId, MovementType kind, long statusId) => |
| | 2 | 139 | | await _db.Movements.AsNoTracking().Include(d => d.MovementStatus) |
| | 2 | 140 | | .Include(d => d.MovementType) |
| | 2 | 141 | | .Where(movement => !movement.IsDeleted && movement.MovementType.Id == kind.Id) |
| | 2 | 142 | | .Where(movement => statusId == 0 || movement.MovementStatus.Id == statusId) |
| | 2 | 143 | | .Where(movement => movement.ParentId == parentId) |
| | 2 | 144 | | .ToListAsync(); |
| | | 145 | | |
| | | 146 | | /// <summary> |
| | | 147 | | /// Возвращает документ в статусе черновик для заказчика и магазина |
| | | 148 | | /// </summary> |
| | | 149 | | /// <param name="contragentId">Идентификатор контрагента заказчика</param> |
| | | 150 | | /// <param name="departmentId">Идентификатор департамента получателя - магазина</param> |
| | | 151 | | /// <param name="type">Тип документа для поиска</param> |
| | | 152 | | /// <returns>Task<Movement></returns> |
| | | 153 | | public async Task<Movement> GetDraft(long contragentId, long departmentId, long senderId) |
| | 63 | 154 | | { |
| | 63 | 155 | | var type = _db.refMovementType.FirstOrDefault(d => d.Id == (long)MovementKind.Order); |
| | 63 | 156 | | return await PrepareMovement(type).FirstOrDefaultAsync(movement => movement.Receiver.Id == departmentId |
| | 63 | 157 | | && movement.Customer. |
| | 63 | 158 | | && movement.Sender.Id |
| | 63 | 159 | | && movement.MovementS |
| | 63 | 160 | | } |
| | | 161 | | |
| | | 162 | | /// <summary> |
| | | 163 | | /// Возвращает документ с минимальным количеством Include |
| | | 164 | | /// </summary> |
| | | 165 | | /// <param name="movementId">Идентификатор документа</param> |
| | | 166 | | /// <returns>Task<Movement></returns> |
| | | 167 | | public async Task<Movement> GetLightMovement(long movementId) => |
| | 42 | 168 | | await PrepareOnlyMovement().FirstOrDefaultAsync(d => d.Id == movementId); |
| | | 169 | | |
| | | 170 | | /// <summary> |
| | | 171 | | /// Возвращает документ по его Id и типу документа |
| | | 172 | | /// </summary> |
| | | 173 | | /// <param name="id">идентификатор документа</param> |
| | | 174 | | /// <param name="type">Тип документа</param> |
| | | 175 | | /// <remarks>auth: aabelentsov</remarks> |
| | | 176 | | /// <returns>Task<Movement></returns> |
| | 1 | 177 | | public async Task<Movement> GetMovement(long id, MovementType type) => await PrepareForSingle() |
| | 1 | 178 | | .FirstOrDefaultAsync(d => d.Id == id && d.MovementType.Id == type.Id); |
| | | 179 | | |
| | | 180 | | public async Task<Movement> GetMovementReadonly(long id, MovementType type) |
| | 58 | 181 | | { |
| | 58 | 182 | | var mvt = await _db.Movements |
| | 58 | 183 | | .Include(d => d.Parent) |
| | 58 | 184 | | .ThenInclude(parent => parent.MovementStatus) |
| | 58 | 185 | | .Include(d => d.Customer) |
| | 58 | 186 | | .ThenInclude(Customer => Customer.JuridicAddress) |
| | 58 | 187 | | .Include(d => d.Customer) |
| | 58 | 188 | | .ThenInclude(Customer => Customer.PhysicAddress) |
| | 58 | 189 | | .Include(d => d.Customer) |
| | 58 | 190 | | .ThenInclude(customer => customer.ContractsAsBuyer) |
| | 58 | 191 | | .ThenInclude(contract => contract.Seller) |
| | 58 | 192 | | .Include(d => d.Supplier) |
| | 58 | 193 | | .ThenInclude(Supplier => Supplier.JuridicAddress) |
| | 58 | 194 | | .Include(d => d.Receiver) |
| | 58 | 195 | | .ThenInclude(Receiver => Receiver.ActualAddress) |
| | 58 | 196 | | .Include(d => d.Receiver) |
| | 58 | 197 | | .ThenInclude(receiver => receiver.Cluster) |
| | 58 | 198 | | .ThenInclude(Cluster => Cluster.ClusterDeliveryTypes) |
| | 58 | 199 | | .ThenInclude(ClusterDeliveryTypes => ClusterDeliveryTypes.DeliveryType) |
| | 58 | 200 | | .Include(d => d.MovementStatus) |
| | 58 | 201 | | .ThenInclude(d => d.StatusOwner) |
| | 58 | 202 | | .Include(d => d.MovementStatus) |
| | 58 | 203 | | .ThenInclude(d => d.MovementType) |
| | 58 | 204 | | .Include(d => d.MovementType) |
| | 58 | 205 | | .Include(d => d.RecState) |
| | 58 | 206 | | .Include(d => d.Sender) |
| | 58 | 207 | | .ThenInclude(Sender => Sender.ActualAddress) |
| | 58 | 208 | | .Include(d => d.Notes) |
| | 58 | 209 | | .ThenInclude(Note => Note.CreatedByUser) |
| | 58 | 210 | | .Include(d => d.Children) |
| | 58 | 211 | | .ThenInclude(c => c.Items) |
| | 58 | 212 | | .ThenInclude(i => i.Good) |
| | 58 | 213 | | .Include(d => d.MovementStatusJournals) |
| | 58 | 214 | | .ThenInclude(m => m.StatusCurrent) |
| | 58 | 215 | | .Include(d => d.DeliveryType) |
| | 58 | 216 | | .AsNoTracking() |
| | 58 | 217 | | .FirstOrDefaultAsync(e => !e.IsDeleted && e.Id == id); |
| | 58 | 218 | | if(mvt != null) |
| | 58 | 219 | | { |
| | 58 | 220 | | mvt.Items = await _db.MovementItems |
| | 58 | 221 | | .Include(Item => Item.Good) |
| | 58 | 222 | | .ThenInclude(Good => Good.DepartmentGoodSettings) |
| | 58 | 223 | | .ThenInclude(DepartmentGoodSetting => DepartmentGoodSetting.Department) |
| | 58 | 224 | | .Include(Items => Items.Good) |
| | 58 | 225 | | .ThenInclude(good => good.Brand) |
| | 58 | 226 | | .Include(Items => Items.Good) |
| | 58 | 227 | | .ThenInclude(x => x.Prices) |
| | 58 | 228 | | .ThenInclude(x => x.PriceTrend) |
| | 58 | 229 | | .ThenInclude(x => x.SupplierDepartment) |
| | 58 | 230 | | .Include(Item => Item.Good) |
| | 58 | 231 | | .ThenInclude(Good => Good.VatsKind) |
| | 58 | 232 | | .Include(Item => Item.Good) |
| | 58 | 233 | | .ThenInclude(Good => Good.Country) |
| | 58 | 234 | | .Include(Item => Item.Good) |
| | 58 | 235 | | .ThenInclude(Good => Good.UnitsKind) |
| | 58 | 236 | | .Include(Items => Items.Good) |
| | 58 | 237 | | .ThenInclude(Good => Good.DefaultBarCode) |
| | 58 | 238 | | .Include(Items => Items.Good) |
| | 58 | 239 | | .ThenInclude(Good => Good.GoodBarcodes) |
| | 58 | 240 | | .ThenInclude(barcode => barcode.BarCode) |
| | 58 | 241 | | .Include(Items => Items.Good) |
| | 58 | 242 | | .ThenInclude(good => good.Category) |
| | 58 | 243 | | .ThenInclude(category => category.DepartmentCategoryRatios) |
| | 58 | 244 | | .Include(Item => Item.Good) |
| | 58 | 245 | | .ThenInclude(good => good.Rests) |
| | 58 | 246 | | .Include(Item => Item.Good) |
| | 58 | 247 | | .ThenInclude(Good => Good.Photos) |
| | 58 | 248 | | .AsNoTracking() |
| | 58 | 249 | | .Where(x => !x.IsDeleted && x.MovementId == id) |
| | 58 | 250 | | .ToListAsync(); |
| | 58 | 251 | | } |
| | 58 | 252 | | return mvt; |
| | 58 | 253 | | } |
| | | 254 | | |
| | | 255 | | /// <summary> |
| | | 256 | | /// Возвращает документ по его Id |
| | | 257 | | /// </summary> |
| | | 258 | | /// <param name="id">Идентификатор документа</param> |
| | | 259 | | /// <returns>Task<Movement></returns> |
| | 14 | 260 | | public async Task<Movement> GetMovement(long id) => await PrepareForSingle() |
| | 14 | 261 | | .FirstOrDefaultAsync(d => d.Id == id); |
| | | 262 | | |
| | | 263 | | /// <summary> |
| | | 264 | | /// Возвращает документ по его ID для работы с вложениями (удаление, обновление) |
| | | 265 | | /// </summary> |
| | | 266 | | /// <param name="id">Идентификатор документа</param> |
| | | 267 | | /// <returns></returns> |
| | 60 | 268 | | public async Task<Movement> GetMovementForItems(long id) => await PrepareForMovementItem() |
| | 60 | 269 | | .FirstOrDefaultAsync(d => d.Id == id); |
| | | 270 | | |
| | | 271 | | /// <summary> |
| | | 272 | | /// Возвращает документ по его ID для работы с вложениями (удаление, обновление) |
| | | 273 | | /// </summary> |
| | | 274 | | /// <param name="id">Идентификатор документа</param> |
| | | 275 | | /// <returns></returns> |
| | 1 | 276 | | public async Task<Movement> GetMovementForItems(Guid guid) => await PrepareForMovementItem() |
| | 1 | 277 | | .FirstOrDefaultAsync(d => d.GUID == guid); |
| | | 278 | | /// <summary> |
| | | 279 | | /// Возвравщает документ для установки следующего статуса |
| | | 280 | | /// </summary> |
| | | 281 | | /// <param name="id">Идентификатор документа</param> |
| | | 282 | | /// <returns></returns> |
| | 225 | 283 | | public async Task<Movement> GetMovementForNextStatus(long id) => await PrepareMovementForNextStatus() |
| | 225 | 284 | | .FirstOrDefaultAsync(d => d.Id == id); |
| | | 285 | | |
| | | 286 | | /// <summary> |
| | | 287 | | /// Возвравщает документ для установки следующего статуса |
| | | 288 | | /// </summary> |
| | | 289 | | /// <param name="guid">Внешний идентификатор документа</param> |
| | | 290 | | /// <returns></returns> |
| | 23 | 291 | | public async Task<Movement> GetMovementForNextStatus(Guid guid) => await PrepareMovementForNextStatus() |
| | 23 | 292 | | .FirstOrDefaultAsync(d => d.GUID == guid); |
| | | 293 | | |
| | | 294 | | /// <summary> |
| | | 295 | | /// Возвращает документ с вложениями |
| | | 296 | | /// </summary> |
| | | 297 | | /// <param name="id">Идентифактор документа</param> |
| | | 298 | | /// <returns></returns> |
| | | 299 | | public async Task<Movement> GetMovementWithAttachment(long id) |
| | 0 | 300 | | { |
| | 0 | 301 | | var movement = await PrepareAttachmentMovement() |
| | 0 | 302 | | .FirstOrDefaultAsync(d => d.Id == id); |
| | 0 | 303 | | if (movement != null) |
| | 0 | 304 | | { |
| | 0 | 305 | | movement.MovementAttachments = movement.MovementAttachments |
| | 0 | 306 | | .Where(d => !d.IsDeleted).ToList(); |
| | 0 | 307 | | } |
| | | 308 | | |
| | 0 | 309 | | return movement; |
| | 0 | 310 | | } |
| | | 311 | | |
| | | 312 | | /// <summary> |
| | | 313 | | /// Возвращает документ по его GUID |
| | | 314 | | /// </summary> |
| | | 315 | | /// <param name="guid">Глобальный идентификатор документа</param> |
| | | 316 | | /// <returns>Task<Movement></returns> |
| | 1 | 317 | | public async Task<Movement> GetMovement(Guid guid) => await PrepareForSingle() |
| | 1 | 318 | | .FirstOrDefaultAsync(d => d.GUID.Equals(guid)); |
| | | 319 | | |
| | | 320 | | /// <summary> |
| | | 321 | | /// Возвращает количество отфильтрованных документов |
| | | 322 | | /// </summary> |
| | | 323 | | /// <param name="documentNumber">Номер документа</param> |
| | | 324 | | /// <param name="customerId">Идентификтор заказчика</param> |
| | | 325 | | /// <param name="receiverId">Идентификтор получателя</param> |
| | | 326 | | /// <param name="supplierId">Идентификтор поставщика</param> |
| | | 327 | | /// <param name="fromDate">Дата начала отбора </param> |
| | | 328 | | /// <param name="toDate">Дата окончания отбора</param> |
| | | 329 | | /// <param name="kind">Тип документа</param> |
| | | 330 | | /// <param name="status">Статус документа - 0 для всех</param> |
| | | 331 | | /// <param name="state">Состояние документа - 0 для всех</param> |
| | | 332 | | /// <param name="excludedStatuses">Массив идентификаторов статусов для исключения из выдачи</param> |
| | | 333 | | /// <returns>Task<int></returns> |
| | | 334 | | public async Task<int> GetCountMovements(long customerId = 0, long receiverId = 0, long supplierId = 0, DateTime |
| | | 335 | | DateTime toDate = default, MovementType kind = null, MovementStatus status = null, RecordsState state = null |
| | 2 | 336 | | { |
| | 2 | 337 | | var movements = PrepareListMovement(kind); |
| | 2 | 338 | | movements = FilterMovement(movements, customerId, receiverId, supplierId, fromDate, toDate, status, state, d |
| | 2 | 339 | | return await Task.FromResult(movements.Count()); |
| | 2 | 340 | | } |
| | | 341 | | |
| | | 342 | | /// <summary> |
| | | 343 | | /// Возвращает запрос для получения текущего статуса по отгрузкам поставщика |
| | | 344 | | /// </summary> |
| | | 345 | | /// <param name="supplierId">идентификато контрагента поставщика</param> |
| | | 346 | | /// <param name="dateFrom">Дата начала выборки по умолчанию все</param> |
| | | 347 | | /// <param name="dateTo">Дата окончания выборки по умолчанию все</param> |
| | | 348 | | /// <param name="docNumber">Номер документа для поиска</param> |
| | | 349 | | /// <returns>IQueryable<Movement></returns> |
| | | 350 | | public IQueryable<Movement> GetMovementStatus(long supplierId, DateTime dateFrom, DateTime dateTo, |
| | 2 | 351 | | Guid docNumber) => _db.Movements |
| | 2 | 352 | | .Include(movement => movement.MovementType) |
| | 2 | 353 | | .Include(movement => movement.MovementStatus) |
| | 2 | 354 | | .Include(movement => movement.Supplier) |
| | 2 | 355 | | .Include(movement => movement.DeliveryType) |
| | 2 | 356 | | .Where(movement => !movement.IsDeleted) |
| | 2 | 357 | | .Where(movement => movement.MovementType.Id == (long)MovementKind.Shipment) |
| | 2 | 358 | | .Where(movement => movement.Supplier.Id == supplierId) |
| | 2 | 359 | | .Where(movement => dateFrom == DateTime.MinValue || movement.CreationDateTime >= dateFrom) |
| | 2 | 360 | | .Where(movement => dateTo == DateTime.MinValue || movement.CreationDateTime <= dateTo) |
| | 2 | 361 | | .Where(movement => docNumber == default || movement.GUID.Equals(docNumber)) |
| | 2 | 362 | | .AsQueryable(); |
| | | 363 | | |
| | | 364 | | /// <summary> |
| | | 365 | | /// Создание документа |
| | | 366 | | /// </summary> |
| | | 367 | | /// <param name="movement">Документ</param> |
| | | 368 | | /// <returns>Task</returns> |
| | | 369 | | public async Task CreateMovement(Movement movement, string envName) |
| | 167 | 370 | | { |
| | 167 | 371 | | if (movement.Parent != null) |
| | 71 | 372 | | _db.Entry(movement.Parent).State = EntityState.Unchanged; |
| | 167 | 373 | | _db.Entry(movement.MovementStatus).State = EntityState.Unchanged; |
| | 167 | 374 | | _db.Entry(movement.MovementType).State = EntityState.Unchanged; |
| | 167 | 375 | | _db.Entry(movement.Supplier).State = EntityState.Unchanged; |
| | 167 | 376 | | if (movement.Sender != null) |
| | 167 | 377 | | _db.Entry(movement.Sender).State = EntityState.Unchanged; |
| | 167 | 378 | | if (movement.Receiver.Id != movement.Customer.Id) |
| | 0 | 379 | | { |
| | 0 | 380 | | _db.Entry(movement.Receiver).State = EntityState.Unchanged; |
| | 0 | 381 | | } |
| | 167 | 382 | | if (movement.RecState != null) |
| | 134 | 383 | | _db.Entry(movement.RecState).State = EntityState.Unchanged; |
| | | 384 | | |
| | 167 | 385 | | await _db.Movements.AddAsync(movement); |
| | 167 | 386 | | await _db.SaveChangesAsync(CurrentUserId); |
| | 167 | 387 | | movement.CreateDocumentNumber(envName); |
| | 167 | 388 | | await _db.SaveChangesAsync(CurrentUserId); |
| | 167 | 389 | | } |
| | | 390 | | |
| | | 391 | | /// <summary> |
| | | 392 | | /// Обновление документа |
| | | 393 | | /// </summary> |
| | | 394 | | /// <param name="movement"></param> |
| | | 395 | | /// <returns>Task</returns> |
| | | 396 | | public async Task UpdateMovement(Movement data) |
| | 340 | 397 | | { |
| | 340 | 398 | | if (!(await MovementExists(data.Id))) |
| | 0 | 399 | | { |
| | 0 | 400 | | throw new ArgumentException($"Документ с идентификатором #{data.Id} не найден"); |
| | | 401 | | } |
| | | 402 | | |
| | 340 | 403 | | if (data.Items != null && data.Items.Count > 0) |
| | 339 | 404 | | { |
| | 1368 | 405 | | for (int i = 0; i < data?.Items.Count; i++) |
| | 345 | 406 | | { |
| | 345 | 407 | | _db.Entry(data?.Items[i]?.RecState).State = EntityState.Unchanged; |
| | 345 | 408 | | } |
| | 339 | 409 | | } |
| | | 410 | | |
| | 340 | 411 | | if (data.Notes != null && data.Notes.Count > 0) |
| | 34 | 412 | | { |
| | 136 | 413 | | for (int i = 0; i < data.Notes.Count; i++) |
| | 34 | 414 | | { |
| | 34 | 415 | | _db.Entry(data.Notes[i]).State = data.Notes[i].Id == 0 ? EntityState.Added : EntityState.Unchanged; |
| | 34 | 416 | | } |
| | 34 | 417 | | } |
| | 340 | 418 | | _db.Movements.Update(data); |
| | 340 | 419 | | await _db.SaveChangesAsync(CurrentUserId); |
| | 340 | 420 | | } |
| | | 421 | | |
| | | 422 | | /// <summary> |
| | | 423 | | /// Удаление элемента из документа |
| | | 424 | | /// </summary> |
| | | 425 | | /// <param name="item">Объект элемента</param> |
| | | 426 | | /// <returns>Task</returns> |
| | | 427 | | public async Task DeleteMovementItem(MovementItem item) |
| | 3 | 428 | | { |
| | 3 | 429 | | _db.Entry(item).State = EntityState.Deleted; |
| | 3 | 430 | | await _db.SaveChangesAsync(CurrentUserId); |
| | 3 | 431 | | } |
| | | 432 | | |
| | | 433 | | /// <summary> |
| | | 434 | | /// Удаление документа или его пометка на удаление |
| | | 435 | | /// </summary> |
| | | 436 | | /// <param name="id">Идентификатор документа</param> |
| | | 437 | | /// <returns>Task</returns> |
| | | 438 | | public async Task DeleteMovement(long id) |
| | 1 | 439 | | { |
| | 1 | 440 | | Movement movement = await _db.Movements.FindAsync(id); |
| | 1 | 441 | | if (movement == null) |
| | 0 | 442 | | throw new KeyNotFoundException($"Record #{id} not found"); |
| | 1 | 443 | | movement.IsDeleted = true; |
| | 1 | 444 | | await _db.SaveChangesAsync(CurrentUserId); |
| | 1 | 445 | | } |
| | | 446 | | /// <summary> |
| | | 447 | | /// Удаление документа или его пометка на удаление |
| | | 448 | | /// </summary> |
| | | 449 | | /// <param name="id">Идентификатор документа</param> |
| | | 450 | | /// <returns>Task</returns> |
| | | 451 | | public async Task DeleteMovement(Movement movement) |
| | 5 | 452 | | { |
| | 5 | 453 | | movement.IsDeleted = true; |
| | 5 | 454 | | await _db.SaveChangesAsync(CurrentUserId); |
| | 5 | 455 | | } |
| | | 456 | | |
| | | 457 | | /// <summary> |
| | | 458 | | /// Проверка на существование записи в бд с таким идентификатором |
| | | 459 | | /// </summary> |
| | | 460 | | /// <param name="id">Идентификатор документа</param> |
| | | 461 | | /// <returns>Task<bool></returns> |
| | 341 | 462 | | public async Task<bool> MovementExists(long id) => await _db.Movements |
| | 341 | 463 | | .Where(d => d.Id == id) |
| | 341 | 464 | | .Where(e => !e.IsDeleted) |
| | 341 | 465 | | .AnyAsync(); |
| | | 466 | | |
| | | 467 | | /// <summary> |
| | | 468 | | /// Сортирует документы по полям |
| | | 469 | | /// </summary> |
| | | 470 | | /// <param name="movements"></param> |
| | | 471 | | /// <param name="sort">сортировка по умолчанию по id - id|desc,created_on,created_on|desc,state,state|desc,statu |
| | | 472 | | /// <returns></returns> |
| | 6 | 473 | | public IQueryable<Movement> SortMovement(IQueryable<Movement> movements, string sort = default) => (sort ?? ""). |
| | 6 | 474 | | { |
| | 6 | 475 | | "inqueuetransferdate" => movements.OrderBy(s => s.MovementStatusJournals.Count > 0 && s.MovementStatusJourn |
| | 6 | 476 | | .Any(d => d.StatusCurrent.Id == (long)MovementsStatus.InQueue) |
| | 6 | 477 | | ? s.MovementStatusJournals |
| | 6 | 478 | | .FirstOrDefault(d => d.StatusCurrent.Id == (long)MovementsStatus.InQueue) |
| | 6 | 479 | | .CreationDateTime |
| | 6 | 480 | | : s.CreationDateTime), |
| | 6 | 481 | | "inqueuetransferdate|desc" => movements.OrderByDescending(s => s.MovementStatusJournals.Count > 0 && s.Move |
| | 6 | 482 | | .Any(d => d.StatusCurrent.Id == (long)MovementsStatus.InQueue) |
| | 6 | 483 | | ? s.MovementStatusJournals |
| | 6 | 484 | | .FirstOrDefault(d => d.StatusCurrent.Id == (long)MovementsStatus.InQueue) |
| | 6 | 485 | | .CreationDateTime |
| | 6 | 486 | | : s.CreationDateTime), |
| | 6 | 487 | | "created_on" => movements.OrderBy(d => d.CreationDateTime), |
| | 6 | 488 | | "created_on|desc" => movements.OrderByDescending(d => d.CreationDateTime), |
| | 6 | 489 | | "state" => movements.OrderBy(d => d.RecState.Id), |
| | 6 | 490 | | "state|desc" => movements.OrderByDescending(d => d.RecState.Id), |
| | 6 | 491 | | "status" => movements.OrderBy(d => d.MovementStatus.Id), |
| | 6 | 492 | | "status|desc" => movements.OrderByDescending(d => d.MovementStatus.Id), |
| | 6 | 493 | | "customer" => movements.OrderBy(d => d.Customer.ShortName), |
| | 6 | 494 | | "customer|desc" => movements.OrderByDescending(d => d.Customer.ShortName), |
| | 6 | 495 | | "supplier" => movements.OrderBy(d => d.Supplier.ShortName), |
| | 6 | 496 | | "supplier|desc" => movements.OrderByDescending(d => d.Supplier.ShortName), |
| | 6 | 497 | | "receiver" => movements.OrderBy(d => d.Receiver.Name), |
| | 6 | 498 | | "receiver|desc" => movements.OrderByDescending(d => d.Receiver.Name), |
| | 6 | 499 | | "id|desc" => movements.OrderByDescending(d => d.Id), |
| | 6 | 500 | | _ => movements.OrderBy(d => d.Id), |
| | 6 | 501 | | }; |
| | | 502 | | |
| | | 503 | | /// <summary> |
| | | 504 | | /// Строит запрос для получения списка вложений в документ |
| | | 505 | | /// </summary> |
| | | 506 | | /// <param name="id"></param> |
| | | 507 | | /// <returns></returns> |
| | 0 | 508 | | private IQueryable<Movement> PrepareAttachmentMovement() => _db.Movements |
| | 0 | 509 | | .Include(d => d.Customer) |
| | 0 | 510 | | .ThenInclude(customer => customer.ContractsAsBuyer) |
| | 0 | 511 | | .ThenInclude(contract => contract.Seller) |
| | 0 | 512 | | .Include(d => d.Supplier) |
| | 0 | 513 | | .Include(d => d.Receiver) |
| | 0 | 514 | | .Include(d => d.MovementStatus) |
| | 0 | 515 | | .Include(d => d.MovementType) |
| | 0 | 516 | | .Include(d => d.RecState) |
| | 0 | 517 | | .Include(d => d.Sender) |
| | 0 | 518 | | .Include(d => d.MovementAttachments) |
| | 0 | 519 | | .Where(e => !e.IsDeleted) |
| | 0 | 520 | | .AsQueryable(); |
| | | 521 | | public Dictionary<long, List<MovementItem>> GetMovementItemsByMovements(List<long> movementIds) |
| | 5 | 522 | | { |
| | 5 | 523 | | return _db.MovementItems |
| | 5 | 524 | | .Include(Items => Items.Good) |
| | 5 | 525 | | .ThenInclude(Good => Good.DefaultBarCode) |
| | 5 | 526 | | .Include(Item => Item.Good) |
| | 5 | 527 | | .ThenInclude(Good => Good.DepartmentGoodSettings) |
| | 5 | 528 | | .ThenInclude(DepartmentGoodSetting => DepartmentGoodSetting.Department) |
| | 5 | 529 | | .Include(d => d.Good) |
| | 5 | 530 | | .ThenInclude(Good => Good.GoodBarcodes) |
| | 5 | 531 | | .ThenInclude(barcode => barcode.BarCode) |
| | 5 | 532 | | .Include(Items => Items.Good) |
| | 5 | 533 | | .ThenInclude(Good => Good.VatsKind) |
| | 5 | 534 | | .Where(x => !x.IsDeleted && movementIds.Contains(x.MovementId.Value)) |
| | 5 | 535 | | .AsNoTracking() |
| | 5 | 536 | | .ToList() |
| | 8 | 537 | | .GroupBy(x => x.MovementId.Value) |
| | 11 | 538 | | .ToDictionary(x => x.Key, x => x.ToList()); |
| | 5 | 539 | | } |
| | | 540 | | |
| | 248 | 541 | | private IQueryable<Movement> PrepareMovementForNextStatus() => _db.Movements |
| | 248 | 542 | | .Include(d => d.Items) |
| | 248 | 543 | | .Include(d => d.DeliveryType) |
| | 248 | 544 | | .Include(d => d.Customer) |
| | 248 | 545 | | .ThenInclude(customer => customer.ContractsAsBuyer) |
| | 248 | 546 | | .ThenInclude(contract => contract.Seller) |
| | 248 | 547 | | .Include(d => d.Supplier) |
| | 248 | 548 | | .Include(d => d.Receiver) |
| | 248 | 549 | | .ThenInclude(receiver => receiver.Cluster) |
| | 248 | 550 | | .Include(d => d.MovementStatus) |
| | 248 | 551 | | .Include(d => d.MovementType) |
| | 248 | 552 | | .Include(d => d.RecState) |
| | 248 | 553 | | .Include(d => d.Sender) |
| | 248 | 554 | | .Include(d => d.Notes) |
| | 248 | 555 | | .Where(e => !e.IsDeleted) |
| | 248 | 556 | | .AsQueryable(); |
| | | 557 | | |
| | 61 | 558 | | private IQueryable<Movement> PrepareForMovementItem() => _db.Movements |
| | 61 | 559 | | .Include(d => d.Items) |
| | 61 | 560 | | .ThenInclude(Item => Item.Good) |
| | 61 | 561 | | .ThenInclude(Good => Good.DepartmentGoodSettings) |
| | 61 | 562 | | .ThenInclude(DepartmentGoodSetting => DepartmentGoodSetting.Department) |
| | 61 | 563 | | .Include(d => d.Items) |
| | 61 | 564 | | .ThenInclude(Items => Items.Good) |
| | 61 | 565 | | .ThenInclude(x => x.Prices) |
| | 61 | 566 | | .ThenInclude(x => x.PriceTrend) |
| | 61 | 567 | | .ThenInclude(x => x.SupplierDepartment) |
| | 61 | 568 | | .Include(d => d.Items) |
| | 61 | 569 | | .ThenInclude(Item => Item.Good) |
| | 61 | 570 | | .ThenInclude(Good => Good.VatsKind) |
| | 61 | 571 | | .Include(d => d.Items) |
| | 61 | 572 | | .ThenInclude(Items => Items.Good) |
| | 61 | 573 | | .ThenInclude(Good => Good.DefaultBarCode) |
| | 61 | 574 | | .Include(d => d.Items) |
| | 61 | 575 | | .ThenInclude(Items => Items.Good) |
| | 61 | 576 | | .ThenInclude(Good => Good.GoodBarcodes) |
| | 61 | 577 | | .ThenInclude(barcode => barcode.BarCode) |
| | 61 | 578 | | .Include(d => d.Items) |
| | 61 | 579 | | .ThenInclude(Items => Items.Good) |
| | 61 | 580 | | .ThenInclude(good => good.Category) |
| | 61 | 581 | | .ThenInclude(category => category.DepartmentCategoryRatios) |
| | 61 | 582 | | .Include(d => d.Items) |
| | 61 | 583 | | .ThenInclude(Item => Item.Good) |
| | 61 | 584 | | .ThenInclude(Good => Good.Photos) |
| | 61 | 585 | | .Include(d => d.Customer) |
| | 61 | 586 | | .ThenInclude(customer => customer.ContractsAsBuyer) |
| | 61 | 587 | | .ThenInclude(contract => contract.Seller) |
| | 61 | 588 | | .Include(d => d.Supplier) |
| | 61 | 589 | | .Include(d => d.Receiver) |
| | 61 | 590 | | .ThenInclude(receiver => receiver.Cluster) |
| | 61 | 591 | | .Include(d => d.MovementStatus) |
| | 61 | 592 | | .Include(d => d.MovementType) |
| | 61 | 593 | | .Include(d => d.RecState) |
| | 61 | 594 | | .Include(d => d.Sender) |
| | 61 | 595 | | .Include(d => d.Notes) |
| | 61 | 596 | | .Where(e => !e.IsDeleted) |
| | 61 | 597 | | .AsQueryable(); |
| | | 598 | | |
| | | 599 | | |
| | | 600 | | |
| | | 601 | | /// <summary> |
| | | 602 | | /// Возвращает запрос с документами и всеми их полями кроме Items. НЕ ДОБАВЛЯЙТЕ СЮДА ЕЩЕ И ВОЗВРАЩЕНИЕ ITEMS, В |
| | | 603 | | /// ВМЕСТО ЭТОГО ИСПОЛЬЗУЙТЕ МЕТОД FillMovementsItems |
| | | 604 | | /// </summary> |
| | | 605 | | /// <param name="kind"></param> |
| | | 606 | | /// <returns></returns> |
| | 51 | 607 | | private IQueryable<Movement> PrepareListMovement(MovementType kind) => _db.Movements |
| | 51 | 608 | | .Include(d => d.Items) |
| | 51 | 609 | | .Include(d => d.Children) |
| | 51 | 610 | | .ThenInclude(children => children.MovementStatus) |
| | 51 | 611 | | .Include(d => d.Parent) |
| | 51 | 612 | | .ThenInclude(parent => parent.MovementStatus) |
| | 51 | 613 | | .Include(d => d.Customer) |
| | 51 | 614 | | .ThenInclude(customer => customer.JuridicAddress) |
| | 51 | 615 | | .Include(d => d.Customer) |
| | 51 | 616 | | .ThenInclude(Customer => Customer.PhysicAddress) |
| | 51 | 617 | | .Include(d => d.Supplier) |
| | 51 | 618 | | .ThenInclude(supplier => supplier.JuridicAddress) |
| | 51 | 619 | | .Include(d => d.Receiver) |
| | 51 | 620 | | .ThenInclude(receiver => receiver.ActualAddress) |
| | 51 | 621 | | .Include(d => d.Receiver) |
| | 51 | 622 | | .ThenInclude(receiver => receiver.Cluster) |
| | 51 | 623 | | .Include(d => d.Receiver) |
| | 51 | 624 | | .ThenInclude(receiver => receiver.Contragent) |
| | 51 | 625 | | .ThenInclude(supplier => supplier.JuridicAddress) |
| | 51 | 626 | | .Include(d => d.MovementStatus) |
| | 51 | 627 | | .Include(d => d.MovementStatus) |
| | 51 | 628 | | .ThenInclude(d => d.MovementType) |
| | 51 | 629 | | .Include(d => d.Sender) |
| | 51 | 630 | | .ThenInclude(Sender => Sender.ActualAddress) |
| | 51 | 631 | | .Include(d => d.MovementType) |
| | 51 | 632 | | .Include(d => d.RecState) |
| | 51 | 633 | | .Include(d => d.Notes) |
| | 51 | 634 | | .ThenInclude(Notes => Notes.CreatedByUser) |
| | 51 | 635 | | .Include(d => d.Children) |
| | 51 | 636 | | .Include(d => d.MovementStatusJournals) |
| | 51 | 637 | | .ThenInclude(m => m.StatusCurrent) |
| | 51 | 638 | | .Include(d => d.DeliveryType) |
| | 51 | 639 | | .Include(d => d.MovementAttachments) |
| | 51 | 640 | | .Where(d => !d.IsDeleted && (kind == null || d.MovementType.Id == kind.Id)) |
| | 51 | 641 | | .Where(d => d.Items.Count > 0) |
| | 51 | 642 | | .AsNoTracking(); |
| | | 643 | | |
| | | 644 | | /// <summary> |
| | | 645 | | /// Подоготовка записей к выдаче |
| | | 646 | | /// </summary> |
| | | 647 | | /// <param name="kind">Тип документа</param> |
| | | 648 | | /// <returns></returns> |
| | 145 | 649 | | private IQueryable<Movement> PrepareMovement(MovementType kind) => _db.Movements |
| | 145 | 650 | | .Include(d => d.Items) |
| | 145 | 651 | | .ThenInclude(Items => Items.Good) |
| | 145 | 652 | | .ThenInclude(Good => Good.DefaultBarCode) |
| | 145 | 653 | | .Include(d => d.Items) |
| | 145 | 654 | | .ThenInclude(Items => Items.Good) |
| | 145 | 655 | | .ThenInclude(Good => Good.GoodBarcodes) |
| | 145 | 656 | | .ThenInclude(barcode => barcode.BarCode) |
| | 145 | 657 | | .Include(d => d.Items) |
| | 145 | 658 | | .ThenInclude(Items => Items.Good) |
| | 145 | 659 | | .ThenInclude(Good => Good.VatsKind) |
| | 145 | 660 | | .Include(d => d.Items) |
| | 145 | 661 | | .ThenInclude(Item => Item.Good) |
| | 145 | 662 | | .ThenInclude(Good => Good.DepartmentGoodSettings) |
| | 145 | 663 | | .ThenInclude(DepartmentGoodSetting => DepartmentGoodSetting.Department) |
| | 145 | 664 | | .Include(d => d.Items) |
| | 145 | 665 | | .ThenInclude(Items => Items.Good) |
| | 145 | 666 | | .ThenInclude(x => x.Prices) |
| | 145 | 667 | | .ThenInclude(x => x.PriceTrend) |
| | 145 | 668 | | .ThenInclude(x => x.SupplierDepartment) |
| | 145 | 669 | | .Include(d => d.Items) |
| | 145 | 670 | | .ThenInclude(Items => Items.Good) |
| | 145 | 671 | | .ThenInclude(good => good.Category) |
| | 145 | 672 | | .ThenInclude(category => category.DepartmentCategoryRatios) |
| | 145 | 673 | | .Include(d => d.Customer) |
| | 145 | 674 | | .ThenInclude(customer => customer.JuridicAddress) |
| | 145 | 675 | | .Include(d => d.Customer) |
| | 145 | 676 | | .ThenInclude(customer => customer.ContractsAsBuyer) |
| | 145 | 677 | | .Include(d => d.Customer) |
| | 145 | 678 | | .ThenInclude(Customer => Customer.PhysicAddress) |
| | 145 | 679 | | .Include(d => d.Supplier) |
| | 145 | 680 | | .ThenInclude(supplier => supplier.JuridicAddress) |
| | 145 | 681 | | .Include(d => d.Receiver) |
| | 145 | 682 | | .ThenInclude(receiver => receiver.ActualAddress) |
| | 145 | 683 | | .Include(d => d.Receiver) |
| | 145 | 684 | | .ThenInclude(receiver => receiver.Cluster) |
| | 145 | 685 | | .Include(d => d.MovementStatus) |
| | 145 | 686 | | .Include(d => d.MovementStatus) |
| | 145 | 687 | | .ThenInclude(d => d.MovementType) |
| | 145 | 688 | | .Include(d => d.Sender) |
| | 145 | 689 | | .ThenInclude(Sender => Sender.ActualAddress) |
| | 145 | 690 | | .Include(d => d.MovementType) |
| | 145 | 691 | | .Include(d => d.RecState) |
| | 145 | 692 | | .Include(d => d.Notes) |
| | 145 | 693 | | .ThenInclude(Notes => Notes.CreatedByUser) |
| | 145 | 694 | | .Include(d => d.Children) |
| | 145 | 695 | | .Include(d => d.MovementStatusJournals) |
| | 145 | 696 | | .ThenInclude(m => m.StatusCurrent) |
| | 145 | 697 | | .Include(d => d.DeliveryType) |
| | 145 | 698 | | .Where(d => !d.IsDeleted && (kind == null || d.MovementType.Id == kind.Id)); |
| | | 699 | | |
| | | 700 | | /// <summary> |
| | | 701 | | /// Фильтрует документы по полям |
| | | 702 | | /// </summary> |
| | | 703 | | /// <param name="movements"></param> |
| | | 704 | | /// <param name="customerId">Идентификтор заказчика</param> |
| | | 705 | | /// <param name="receiverId">Идентификтор получателя</param> |
| | | 706 | | /// <param name="supplierId">Идентификтор поставщика</param> |
| | | 707 | | /// <param name="fromDate">Дата начала отбора </param> |
| | | 708 | | /// <param name="toDate">Дата окончания отбора</param> |
| | | 709 | | /// <param name="status">Статус документа - 0 для всех</param> |
| | | 710 | | /// <param name="state">Состояние документа - 0 для всех</param> |
| | | 711 | | /// <param name="documentNumber"></param> |
| | | 712 | | /// <param name="excludedStatuses"></param> |
| | | 713 | | /// <returns></returns> |
| | | 714 | | private IQueryable<Movement> FilterMovement(IQueryable<Movement> movements, long customerId = 0, |
| | | 715 | | long receiverId = 0, long supplierId = 0, DateTime fromDate = default, |
| | | 716 | | DateTime toDate = default, MovementStatus status = null, RecordsState state = null, |
| | | 717 | | string documentNumber = null, long[] excludedStatuses = null, string contragentBuyerFilter = default, long s |
| | 53 | 718 | | movements |
| | 53 | 719 | | .Where(e => !e.IsDeleted) |
| | 53 | 720 | | .Where(d => state == null || d.RecState.Id == state.Id) |
| | 53 | 721 | | .Where(d => status == null || d.MovementStatus.Id == status.Id) |
| | 53 | 722 | | .Where(d => excludedStatuses == null || !excludedStatuses.Contains(d.MovementStatus.Id)) |
| | 53 | 723 | | .Where(d => customerId == 0 || d.Customer.Id == customerId) |
| | 53 | 724 | | .Where(d => receiverId == 0 || d.Receiver.Id == receiverId) |
| | 53 | 725 | | .Where(d => supplierId == 0 || d.Supplier.Id == supplierId) |
| | 53 | 726 | | .Where(d => senderId == 0 || d.Sender.Id == senderId) |
| | 53 | 727 | | .Where(d => fromDate == DateTime.MinValue || d.CreationDateTime >= fromDate) |
| | 53 | 728 | | .Where(d => toDate == DateTime.MinValue || d.CreationDateTime <= toDate) |
| | 53 | 729 | | .Where(x => string.IsNullOrWhiteSpace(documentNumber) || |
| | 53 | 730 | | x.DocumentNumber.ToLower().Contains(documentNumber.ToLower())) |
| | 53 | 731 | | .Where(d => string.IsNullOrEmpty(contragentBuyerFilter) || |
| | 53 | 732 | | (d.Customer.ShortName.ToLower().Contains(contragentBuyerFilter.ToLower()) || |
| | 53 | 733 | | d.Customer.FullName.ToLower().Contains(contragentBuyerFilter))); |
| | | 734 | | |
| | 42 | 735 | | private IQueryable<Movement> PrepareOnlyMovement() => _db.Movements |
| | 42 | 736 | | .Include(d => d.Items) |
| | 42 | 737 | | .ThenInclude(item => item.Good) |
| | 42 | 738 | | .Include(d => d.Parent) |
| | 42 | 739 | | .Include(d => d.Customer) |
| | 42 | 740 | | .ThenInclude(customer => customer.PhysicAddress) |
| | 42 | 741 | | .Include(d => d.Supplier) |
| | 42 | 742 | | .Include(d => d.Sender) |
| | 42 | 743 | | .Include(d => d.Receiver) |
| | 42 | 744 | | .Include(d => d.RecState) |
| | 42 | 745 | | .Include(d => d.MovementStatus) |
| | 42 | 746 | | .ThenInclude(status => status.StatusOwner) |
| | 42 | 747 | | .Include(d => d.MovementType) |
| | 42 | 748 | | .Include(d => d.Children) |
| | 42 | 749 | | .Include(d => d.DeliveryType) |
| | 42 | 750 | | .Where(d => !d.IsDeleted) |
| | 42 | 751 | | .AsQueryable(); |
| | | 752 | | |
| | 16 | 753 | | private IQueryable<Movement> PrepareForSingle() => _db.Movements |
| | 16 | 754 | | .Include(d => d.Items) |
| | 16 | 755 | | .ThenInclude(Item => Item.Good) |
| | 16 | 756 | | .ThenInclude(Good => Good.DepartmentGoodSettings) |
| | 16 | 757 | | .ThenInclude(DepartmentGoodSetting => DepartmentGoodSetting.Department) |
| | 16 | 758 | | .Include(d => d.Items) |
| | 16 | 759 | | .ThenInclude(Items => Items.Good) |
| | 16 | 760 | | .ThenInclude(good => good.Brand) |
| | 16 | 761 | | .Include(d => d.Items) |
| | 16 | 762 | | .ThenInclude(Items => Items.Good) |
| | 16 | 763 | | .ThenInclude(x => x.Prices) |
| | 16 | 764 | | .ThenInclude(x => x.PriceTrend) |
| | 16 | 765 | | .ThenInclude(x => x.SupplierDepartment) |
| | 16 | 766 | | .Include(d => d.Items) |
| | 16 | 767 | | .ThenInclude(Item => Item.Good) |
| | 16 | 768 | | .ThenInclude(Good => Good.VatsKind) |
| | 16 | 769 | | .Include(d => d.Items) |
| | 16 | 770 | | .ThenInclude(Item => Item.Good) |
| | 16 | 771 | | .ThenInclude(Good => Good.Country) |
| | 16 | 772 | | .Include(d => d.Items) |
| | 16 | 773 | | .ThenInclude(Item => Item.Good) |
| | 16 | 774 | | .ThenInclude(Good => Good.UnitsKind) |
| | 16 | 775 | | .Include(d => d.Items) |
| | 16 | 776 | | .ThenInclude(Items => Items.Good) |
| | 16 | 777 | | .ThenInclude(Good => Good.DefaultBarCode) |
| | 16 | 778 | | .Include(d => d.Items) |
| | 16 | 779 | | .ThenInclude(Items => Items.Good) |
| | 16 | 780 | | .ThenInclude(Good => Good.GoodBarcodes) |
| | 16 | 781 | | .ThenInclude(barcode => barcode.BarCode) |
| | 16 | 782 | | .Include(d => d.Items) |
| | 16 | 783 | | .ThenInclude(Items => Items.Good) |
| | 16 | 784 | | .ThenInclude(good => good.Category) |
| | 16 | 785 | | .ThenInclude(category => category.DepartmentCategoryRatios) |
| | 16 | 786 | | .Include(d => d.Items) |
| | 16 | 787 | | .ThenInclude(Item => Item.Good) |
| | 16 | 788 | | .ThenInclude(good => good.Rests) |
| | 16 | 789 | | .Include(d => d.Items) |
| | 16 | 790 | | .ThenInclude(Item => Item.Good) |
| | 16 | 791 | | .ThenInclude(Good => Good.Photos) |
| | 16 | 792 | | .Include(d => d.Parent) |
| | 16 | 793 | | .ThenInclude(parent => parent.MovementStatus) |
| | 16 | 794 | | .Include(d => d.Customer) |
| | 16 | 795 | | .ThenInclude(Customer => Customer.JuridicAddress) |
| | 16 | 796 | | .Include(d => d.Customer) |
| | 16 | 797 | | .ThenInclude(Customer => Customer.PhysicAddress) |
| | 16 | 798 | | .Include(d => d.Customer) |
| | 16 | 799 | | .ThenInclude(Customer => Customer.Owner) |
| | 16 | 800 | | .Include(d => d.Customer) |
| | 16 | 801 | | .ThenInclude(customer => customer.ContractsAsBuyer) |
| | 16 | 802 | | .ThenInclude(contract => contract.Seller) |
| | 16 | 803 | | .Include(d => d.Supplier) |
| | 16 | 804 | | .ThenInclude(Supplier => Supplier.JuridicAddress) |
| | 16 | 805 | | .Include(d => d.Receiver) |
| | 16 | 806 | | .ThenInclude(Receiver => Receiver.ActualAddress) |
| | 16 | 807 | | .Include(d => d.Receiver) |
| | 16 | 808 | | .ThenInclude(receiver => receiver.Cluster) |
| | 16 | 809 | | .ThenInclude(Cluster=>Cluster.ClusterDeliveryTypes) |
| | 16 | 810 | | .ThenInclude(ClusterDeliveryTypes => ClusterDeliveryTypes.DeliveryType) |
| | 16 | 811 | | .Include(d => d.MovementStatus) |
| | 16 | 812 | | .ThenInclude(d => d.StatusOwner) |
| | 16 | 813 | | .Include(d => d.MovementStatus) |
| | 16 | 814 | | .ThenInclude(d => d.MovementType) |
| | 16 | 815 | | .Include(d => d.MovementType) |
| | 16 | 816 | | .Include(d => d.RecState) |
| | 16 | 817 | | .Include(d => d.Sender) |
| | 16 | 818 | | .ThenInclude(Sender => Sender.ActualAddress) |
| | 16 | 819 | | .Include(d => d.Notes) |
| | 16 | 820 | | .ThenInclude(Note => Note.CreatedByUser) |
| | 16 | 821 | | .Include(d => d.Children) |
| | 16 | 822 | | .ThenInclude(c => c.Items) |
| | 16 | 823 | | .ThenInclude(i => i.Good) |
| | 16 | 824 | | .Include(d => d.MovementStatusJournals) |
| | 16 | 825 | | .ThenInclude(m => m.StatusCurrent) |
| | 16 | 826 | | .Include(d => d.DeliveryType) |
| | 16 | 827 | | .Where(e => !e.IsDeleted) |
| | 16 | 828 | | .AsQueryable(); |
| | | 829 | | } |
| | | 830 | | } |