using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using PartSource.Automation.Models; using PartSource.Data; using PartSource.Data.Contexts; using PartSource.Data.Dtos; using PartSource.Data.Models; using PartSource.Services; using Ratermania.Automation.Interfaces; using Ratermania.Shopify; using Ratermania.Shopify.Exceptions; using Ratermania.Shopify.Resources; using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace PartSource.Automation.Jobs.POC { public class UpdateFitmentScratchpad : IAutomationJob { private readonly ILogger _logger; private readonly ShopifyClient _shopifyClient; private readonly PartSourceContext _partSourceContext; private readonly FitmentContext _fitmentContext; private readonly VehicleService _vehicleService; public UpdateFitmentScratchpad(ILogger logger, PartSourceContext partSourceContext, FitmentContext fitmentContext, ShopifyClient shopifyClient, VehicleService vehicleService) { _logger = logger; _partSourceContext = partSourceContext; _fitmentContext = fitmentContext; _shopifyClient = shopifyClient; _vehicleService = vehicleService; } public async Task Run() { IList productTypes = new List { "C172-S231-F23107_(PS) Wipers - TRICO Neoform", "CA172-SC231-FL23106_Wiper Blades - Bosch Icon", "CA172-SC231-FL23107_(PS) Wipers - TRICO Neoform", "CA172-SC231-FL23109_(PS) Wipers - TRICO Tech/Exact Fit", "CA172-SC231-FL23110_Wiper Accessories", "CA172-SC231-FL23114_Wiper Blades - Rear", "CA172-SC231-FL23116_(PS) Wipers - Bosch Insight (Hybrid)", "CA172-SC231-FL23117_(PS) Wipers - Bosch Clear Advantage (Beam)", "CA172-SC231-FL23118_(PS) Wipers - Winter", "CA172-SC231-FL23125_Wiper Blades - Bosch Areotwin" }; IList csvData = new List { "\"Line Code\", \"Part Number\", \"Year\", \"Make\", \"Model\", \"Position\"" }; foreach (string type in productTypes) { IEnumerable products = null; try { products = await _shopifyClient.Products.Get(new Dictionary { { "limit", 250 }, { "product_type", type } }); } catch (Exception ex) { _logger.LogError("Failed to get products from Shopify", ex); throw; } while (products != null && products.Any()) { foreach (Product product in products) { ImportData importData = null; try { IEnumerable metafields = await _shopifyClient.Metafields.Get(new Dictionary { { "metafield[owner_id]", product.Id }, { "metafield[owner_resource]", "product" } }); importData = new ImportData { LineCode = metafields.FirstOrDefault(m => m.Key == "custom_label_0").Value ?? string.Empty, PartNumber = product.Title.Split(' ')[0], VariantSku = product.Variants[0].Sku // They know we can't do fitment for variants }; string csvRow = product.BodyHtml.Substring(0, product.BodyHtml.IndexOf("") + "".Length); IList vehicles = _vehicleService.GetVehicleFitmentForPart(importData.PartNumber, importData.LineCode); if (vehicles.Count > 0) { foreach (VehicleFitmentDto vehicle in vehicles) { try { csvData.Add($"\"{importData.LineCode}\", \"{importData.PartNumber}\", \"{vehicle.Vehicle.Year}\", \"{vehicle.Vehicle.MakeName}\", \"{vehicle.Vehicle.ModelName}\", \"{vehicle.Fitment.Position}\""); } catch { // This is still a POC at this point. Oh well... } } } } catch (Exception ex) { _logger.LogError($"Failed to updated fitment data for SKU {importData?.VariantSku} - {ex.Message}", ex); } } try { Console.WriteLine($"Did an iteration of {type}"); products = await _shopifyClient.Products.GetNext(); } catch (Exception ex) { _logger.LogWarning(ex, "Failed to get the next set of products. Retrying"); products = await _shopifyClient.Products.GetPrevious(); } } } await File.WriteAllLinesAsync("C:\\users\\Tommy\\desktop\\Wiper Fitment.csv", csvData); ; } } }