| | | 1 | | namespace Services.BitrixStockServices; |
| | | 2 | | |
| | | 3 | | /// <summary>Сравнение остатков 1С и Ozon по связанному складу — только рекомендация.</summary> |
| | | 4 | | public static class BitrixStockSyncActionResolver |
| | | 5 | | { |
| | | 6 | | public static (string Action, string Label, string Icon, string RowClass, string? Note) Resolve( |
| | | 7 | | bool isInactive, |
| | | 8 | | bool hasValidProductId, |
| | | 9 | | bool hasLinkedOneCStore, |
| | | 10 | | bool hasStockLinkageMapping, |
| | | 11 | | int oneCQty, |
| | | 12 | | int ozonQty) |
| | | 13 | | { |
| | 0 | 14 | | if (!hasStockLinkageMapping) |
| | | 15 | | { |
| | 0 | 16 | | return (BitrixStockSyncReportActions.Skip, "Нет связи", "—", |
| | 0 | 17 | | "sync-row-skip", "Склад Ozon не связан с 1С в WarehouseMapping"); |
| | | 18 | | } |
| | | 19 | | |
| | 0 | 20 | | if (!hasLinkedOneCStore) |
| | | 21 | | { |
| | 0 | 22 | | return (BitrixStockSyncReportActions.Skip, "Нет склада 1С", "—", |
| | 0 | 23 | | "sync-row-skip", "Связь есть, но строка склада 1С на товаре не найдена"); |
| | | 24 | | } |
| | | 25 | | |
| | 0 | 26 | | if (!hasValidProductId) |
| | | 27 | | { |
| | 0 | 28 | | return (BitrixStockSyncReportActions.Skip, "Нет в каталоге Ozon", "—", |
| | 0 | 29 | | "sync-row-skip", "Нет product_id — накат/обнуление через API невозможны"); |
| | | 30 | | } |
| | | 31 | | |
| | 0 | 32 | | if (isInactive) |
| | | 33 | | { |
| | 0 | 34 | | if (ozonQty > 0) |
| | | 35 | | { |
| | 0 | 36 | | return (BitrixStockSyncReportActions.Clear, "Обнулить", "⊘", |
| | 0 | 37 | | "sync-row-clear", |
| | 0 | 38 | | $"Неактивный товар: на Ozon {ozonQty}, в 1С {oneCQty} — рекомендуется 0"); |
| | | 39 | | } |
| | | 40 | | |
| | 0 | 41 | | return (BitrixStockSyncReportActions.Match, "Совпадает", "✓", |
| | 0 | 42 | | "sync-row-match", "Неактивный, на Ozon уже 0"); |
| | | 43 | | } |
| | | 44 | | |
| | 0 | 45 | | var delta = oneCQty - ozonQty; |
| | 0 | 46 | | if (delta == 0) |
| | | 47 | | { |
| | 0 | 48 | | return (BitrixStockSyncReportActions.Match, "Совпадает", "✓", |
| | 0 | 49 | | "sync-row-match", null); |
| | | 50 | | } |
| | | 51 | | |
| | 0 | 52 | | if (oneCQty == 0 && ozonQty > 0) |
| | | 53 | | { |
| | 0 | 54 | | return (BitrixStockSyncReportActions.Clear, "Обнулить", "⊘", |
| | 0 | 55 | | "sync-row-clear", |
| | 0 | 56 | | $"В 1С 0, на Ozon {ozonQty}"); |
| | | 57 | | } |
| | | 58 | | |
| | 0 | 59 | | if (delta > 0) |
| | | 60 | | { |
| | 0 | 61 | | return (BitrixStockSyncReportActions.Push, "Накатить", "↑", |
| | 0 | 62 | | "sync-row-push", |
| | 0 | 63 | | $"Увеличить Ozon на {delta} (1С {oneCQty} → Ozon {ozonQty})"); |
| | | 64 | | } |
| | | 65 | | |
| | 0 | 66 | | return (BitrixStockSyncReportActions.Decrease, "Уменьшить", "↓", |
| | 0 | 67 | | "sync-row-decrease", |
| | 0 | 68 | | $"Уменьшить Ozon на {-delta} (1С {oneCQty} ← Ozon {ozonQty})"); |
| | | 69 | | } |
| | | 70 | | } |