using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging.Abstractions; using PartSource.Automation.Jobs.Interfaces; using PartSource.Automation.Models; using PartSource.Data; using PartSource.Data.Models; using Ratermania.Shopify; using Ratermania.Shopify.Resources; using Ratermania.Shopify.Resources.Enums; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace PartSource.Automation.Jobs { public class UpdatePricing : IAutomationJob { private readonly PartSourceContext _partSourceContext; private readonly ShopifyClient _shopifyClient; public UpdatePricing(PartSourceContext partSourceContext, ShopifyClient shopifyClient) { _partSourceContext = partSourceContext; _shopifyClient = shopifyClient; } public async Task Run() { IEnumerable products = null; IEnumerable prices = null; int updateCount = 0; try { products = await _shopifyClient.Products.Get(new Dictionary { { "limit", 250 } }); prices = await _partSourceContext.PartPrices.ToListAsync(); } catch (Exception ex) { // TODO: Logging return new AutomationJobResult { Message = "Failed to get products from Shopify", IsSuccess = false }; } while (products != null && products.Any()) { foreach (Product product in products) { if (product.Variants.Length > 0) { Variant variant = product.Variants[0]; PartPrice partPrice = prices.Where(p => p.SKU == variant.Sku).FirstOrDefault(); if (partPrice == null || !partPrice.Your_Price.HasValue || !partPrice.Compare_Price.HasValue) { continue; } try { if (product.Variants[0].Price != partPrice.Your_Price.Value || product.Variants[0].CompareAtPrice != partPrice.Compare_Price.Value) { product.Variants[0].Price = partPrice.Your_Price.Value; product.Variants[0].CompareAtPrice = partPrice.Compare_Price.Value; product.PublishedAt = partPrice.Active.Trim().ToUpperInvariant() == "Y" ? (DateTime?)DateTime.Now : null; product.PublishedScope = PublishedScope.Global; Metafield metafield = new Metafield { Namespace = "Pricing", Key = "CorePrice", Value = partPrice.Core_Price.HasValue ? partPrice.Core_Price.Value.ToString() : "0.00", ValueType = "string", OwnerResource = "product", OwnerId = product.Id }; try { await _shopifyClient.Metafields.Add(metafield); await _shopifyClient.Products.Update(product); updateCount++; } catch (Exception ex) { Console.WriteLine("bad update"); } } } catch (Exception ex) { Console.WriteLine("failed getting parts"); } } } // _partSourceContext.SaveChanges(); try { //await _shopifyClient.Products.SaveChanges(); products = await _shopifyClient.Products.GetNext(); Console.SetCursorPosition(0, 2); Console.Clear(); Console.Write($"Updated: {updateCount} "); } catch (Exception ex) { products = await _shopifyClient.Products.GetPrevious(); } } return new AutomationJobResult { Message = $"The nightly pricing update has completed. {updateCount} products were updated.", IsSuccess = true }; } } }