< Summary

Information
Class: OzonOrdersWeb.Areas.Studio2.Controllers.TransactionJobsController
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Controllers/TransactionJobsController.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 129
Coverable lines: 129
Total lines: 246
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 20
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
Index()100%210%
Create()100%210%
Create()0%620%
Edit()0%620%
Edit()0%2040%
Delete()100%210%
Executions(...)0%2040%
ExecutionDetails()0%620%
ExecutionOrders()0%620%
PopulateViewBagAsync()0%2040%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Controllers/TransactionJobsController.cs

#LineLine coverage
 1using Microsoft.AspNetCore.Authorization;
 2using Microsoft.AspNetCore.Mvc;
 3using Microsoft.AspNetCore.Mvc.Rendering;
 4using Microsoft.EntityFrameworkCore;
 5using Newtonsoft.Json;
 6using OServices.FiltersServices.FilterModels;
 7using OzonDomains;
 8using OzonDomains.Models;
 9using OzonOrdersWeb.Areas.Studio2.ViewModels.TransactionJobs;
 10using OzonOrdersWeb.WebServices.TransactionJobs;
 11using OzonRepositories.Context;
 12using Services.BackgroundJobsServices;
 13using Services.DataServices;
 14
 15namespace OzonOrdersWeb.Areas.Studio2.Controllers;
 16
 17[Authorize(Roles = "Admin")]
 18[Area("Studio2")]
 19[Route("Studio2/TransactionJobs")]
 20public class TransactionJobsController : Controller
 21{
 22    private readonly IBackgroundJobScheduleService _scheduleService;
 23    private readonly IBackgroundJobLoggingService _loggingService;
 24    private readonly OzonClientServices _ozonClientServices;
 25    private readonly ApplicationDbContext _context;
 26
 027    public TransactionJobsController(
 028        IBackgroundJobScheduleService scheduleService,
 029        IBackgroundJobLoggingService loggingService,
 030        OzonClientServices ozonClientServices,
 031        ApplicationDbContext context)
 32    {
 033        _scheduleService = scheduleService;
 034        _loggingService = loggingService;
 035        _ozonClientServices = ozonClientServices;
 036        _context = context;
 037    }
 38
 39    [HttpGet("")]
 40    public async Task<IActionResult> Index()
 41    {
 042        var schedules = await _scheduleService.GetAllSchedulesAsync();
 043        return View(schedules);
 044    }
 45
 46    [HttpGet("Create")]
 47    public async Task<IActionResult> Create()
 48    {
 049        await PopulateViewBagAsync();
 050        return View();
 051    }
 52
 53    [HttpPost("Create")]
 54    [ValidateAntiForgeryToken]
 55    public async Task<IActionResult> Create(BackgroundJobSchedule schedule)
 56    {
 057        schedule.DaysBack = ReportDeliveryDateFilter.TransactionJobDaysBack;
 58
 059        if (!ModelState.IsValid)
 60        {
 061            await PopulateViewBagAsync();
 062            return View(schedule);
 63        }
 64
 65        try
 66        {
 067            await _scheduleService.CreateScheduleAsync(schedule);
 068            TempData["Success"] = "Расписание успешно создано";
 069            return RedirectToAction(nameof(Index));
 70        }
 071        catch (Exception ex)
 72        {
 073            ModelState.AddModelError("", ex.Message);
 074            await PopulateViewBagAsync();
 075            return View(schedule);
 76        }
 077    }
 78
 79    [HttpGet("Edit/{id}")]
 80    public async Task<IActionResult> Edit(int id)
 81    {
 082        var schedule = await _scheduleService.GetScheduleByIdAsync(id);
 083        if (schedule == null)
 84        {
 085            TempData["Error"] = "Расписание не найдено";
 086            return RedirectToAction(nameof(Index));
 87        }
 88
 089        await PopulateViewBagAsync();
 090        return View(schedule);
 091    }
 92
 93    [HttpPost("Edit/{id}")]
 94    [ValidateAntiForgeryToken]
 95    public async Task<IActionResult> Edit(int id, BackgroundJobSchedule schedule)
 96    {
 097        if (id != schedule.Id)
 98        {
 099            TempData["Error"] = "Неверный ID расписания";
 0100            return RedirectToAction(nameof(Index));
 101        }
 102
 0103        schedule.DaysBack = ReportDeliveryDateFilter.TransactionJobDaysBack;
 104
 0105        if (!ModelState.IsValid)
 106        {
 0107            await PopulateViewBagAsync();
 0108            return View(schedule);
 109        }
 110
 111        try
 112        {
 0113            await _scheduleService.UpdateScheduleAsync(schedule);
 0114            TempData["Success"] = "Расписание успешно обновлено";
 0115            return RedirectToAction(nameof(Index));
 116        }
 0117        catch (Exception ex)
 118        {
 0119            ModelState.AddModelError("", ex.Message);
 0120            await PopulateViewBagAsync();
 0121            return View(schedule);
 122        }
 0123    }
 124
 125    [HttpPost("Delete/{id}")]
 126    [ValidateAntiForgeryToken]
 127    public async Task<IActionResult> Delete(int id)
 128    {
 129        try
 130        {
 0131            await _scheduleService.DeleteScheduleAsync(id);
 0132            TempData["Success"] = "Расписание успешно удалено";
 0133        }
 0134        catch (Exception ex)
 135        {
 0136            TempData["Error"] = $"Ошибка удаления: {ex.Message}";
 0137        }
 138
 0139        return RedirectToAction(nameof(Index));
 0140    }
 141
 142    [HttpGet("Executions")]
 143    public IActionResult Executions(
 144        int? scheduleId = null,
 145        string? status = null,
 146        string? triggerType = null,
 147        DateTime? from = null,
 148        DateTime? to = null,
 149        int page = 1,
 150        int pageSize = 50) =>
 0151        RedirectToAction("Index", "JobLogs", new
 0152        {
 0153            area = "Studio2",
 0154            tab = "transactions",
 0155            scheduleId,
 0156            status,
 0157            triggerType,
 0158            from = from?.ToString("yyyy-MM-dd"),
 0159            to = to?.ToString("yyyy-MM-dd"),
 0160            page,
 0161            pageSize
 0162        });
 163
 164    [HttpGet("ExecutionDetails/{id}")]
 165    public async Task<IActionResult> ExecutionDetails(long id)
 166    {
 0167        var execution = await _context.BackgroundJobExecutions
 0168            .AsNoTracking()
 0169            .Include(e => e.Schedule)
 0170            .FirstOrDefaultAsync(e => e.Id == id);
 171
 0172        if (execution == null)
 173        {
 0174            TempData["Error"] = "Запуск не найден";
 0175            return RedirectToAction(nameof(Executions));
 176        }
 177
 0178        var steps = await _context.BackgroundJobSteps
 0179            .AsNoTracking()
 0180            .Where(s => s.ExecutionId == id)
 0181            .OrderBy(s => s.StepNumber)
 0182            .ToListAsync();
 183
 0184        var reportLoads = await _context.BackgroundReportLoads
 0185            .AsNoTracking()
 0186            .Include(r => r.OzonClient)
 0187            .Where(r => r.ExecutionId == id)
 0188            .OrderByDescending(r => r.CreatedAt)
 0189            .ToListAsync();
 190
 0191        var transactionResults = await _context.BackgroundTransactionResults
 0192            .AsNoTracking()
 0193            .Include(r => r.Order)
 0194            .Where(r => r.ExecutionId == id)
 0195            .OrderByDescending(r => r.CreatedAt)
 0196            .ToListAsync();
 197
 0198        return View(new BackgroundJobExecutionDetailsViewModel
 0199        {
 0200            Execution = execution,
 0201            Schedule = execution.Schedule,
 0202            Grid = ExecutionDetailsGridRows.Build(execution, execution.Schedule, steps, reportLoads, transactionResults)
 0203        });
 0204    }
 205
 206    [HttpGet("ExecutionDetails/{id}/Orders")]
 207    public async Task<IActionResult> ExecutionOrders(long id)
 208    {
 0209        var shipmentNumbers = await _context.BackgroundTransactionResults
 0210            .AsNoTracking()
 0211            .Where(r => r.ExecutionId == id)
 0212            .Select(r => r.Order != null ? r.Order.ShipmentNumber : null)
 0213            .Where(n => !string.IsNullOrWhiteSpace(n))
 0214            .Select(n => n!.Trim())
 0215            .Distinct()
 0216            .ToListAsync();
 217
 0218        var filterData = new OrderFilterModel
 0219        {
 0220            ShipmentNumber = shipmentNumbers.Any() ? string.Join(",", shipmentNumbers) : null,
 0221            GroupByShipment = true,
 0222            IncludeArchived = false,
 0223            SyncClientStatusesOnLoad = false,
 0224            OnlyWithZasyl = false
 0225        };
 226
 0227        Response.Cookies.Append("FilterData", JsonConvert.SerializeObject(filterData));
 228
 0229        return RedirectToAction("Index", "Orders", new { area = "Studio2" });
 0230    }
 231
 232    private async Task PopulateViewBagAsync()
 233    {
 234        // Только клиенты с типом Ozon
 0235        var allClients = await _ozonClientServices.GetOzonClients();
 0236        var ozonClients = allClients.Where(c => c.ClientType == ClientType.OZON).ToList();
 0237        ViewBag.OzonClients = new SelectList(ozonClients, "Id", "Name");
 238
 239        // Поддерживаемые типы фоновых заданий транзакций
 0240        ViewBag.JobTypes = new SelectList(new[]
 0241        {
 0242            new { Value = "ShippedToCommissioner", Text = "Отгружен комиссионеру" },
 0243            new { Value = "CustomerReturn", Text = "Возврат покупателя" }
 0244        }, "Value", "Text");
 0245    }
 246}