diff --git a/sync-service/src/main/java/com/teterialosjuanjos/tfg/sync_service/sync/ProductSyncService.java b/sync-service/src/main/java/com/teterialosjuanjos/tfg/sync_service/sync/ProductSyncService.java index 33deaae..94e07b9 100644 --- a/sync-service/src/main/java/com/teterialosjuanjos/tfg/sync_service/sync/ProductSyncService.java +++ b/sync-service/src/main/java/com/teterialosjuanjos/tfg/sync_service/sync/ProductSyncService.java @@ -94,34 +94,37 @@ public class ProductSyncService { private void pushProduct(DolibarrProductDto dolProduct) { String sku = dolProduct.ref(); - Optional existing = productMappingRepository.findBySku(sku); - if (existing.isEmpty()) { + // PS is source of truth: local mapping may be stale if PS products were deleted + Optional existingPs = prestashopClient.getProductByReference(sku); + + if (existingPs.isPresent()) { + Integer psId = existingPs.get().id(); + prestashopClient.updateProduct(psId, toPrestashopDto(dolProduct, psId)); + upsertMapping(sku, dolProduct.id(), psId); + log.debug("ProductSync: updated PS product reference={} id={}", sku, psId); + } else { PrestashopProductDto created = prestashopClient.createProduct(toPrestashopDto(dolProduct, null)); if (created == null) { throw new PrestashopApiException( "Product created in PS but not found via GET (reference=" + sku + ")"); } - productMappingRepository.save(ProductMapping.builder() - .sku(sku) - .dolibarrId(dolProduct.id()) - .prestashopId(created.id()) - .lastSyncedAt(Instant.now()) - .syncStatus(SyncStatus.SYNCED) - .build()); + upsertMapping(sku, dolProduct.id(), created.id()); log.debug("ProductSync: created PS product reference={} id={}", sku, created.id()); - } else { - ProductMapping mapping = existing.get(); - prestashopClient.updateProduct(mapping.getPrestashopId(), - toPrestashopDto(dolProduct, mapping.getPrestashopId())); - mapping.setLastSyncedAt(Instant.now()); - mapping.setSyncStatus(SyncStatus.SYNCED); - mapping.setErrorMessage(null); - productMappingRepository.save(mapping); - log.debug("ProductSync: updated PS product reference={}", sku); } } + private void upsertMapping(String sku, Integer dolibarrId, Integer prestashopId) { + ProductMapping mapping = productMappingRepository.findBySku(sku) + .orElseGet(() -> ProductMapping.builder().sku(sku).build()); + mapping.setDolibarrId(dolibarrId); + mapping.setPrestashopId(prestashopId); + mapping.setLastSyncedAt(Instant.now()); + mapping.setSyncStatus(SyncStatus.SYNCED); + mapping.setErrorMessage(null); + productMappingRepository.save(mapping); + } + private void markError(String sku, String message) { productMappingRepository.findBySku(sku).ifPresent(m -> { m.setSyncStatus(SyncStatus.ERROR); @@ -140,7 +143,7 @@ public class ProductSyncService { String categoryId = String.valueOf(integrationProperties.prestashop().defaultCategoryId()); String label = src.label() != null ? src.label() : ""; String description = src.description() != null ? src.description() : ""; - String active = (src.toSell() != null && src.toSell() == 1) ? "1" : "0"; + String active = (src.toSell() != null && src.toSell() == 0) ? "0" : "1"; return new PrestashopProductDto( prestashopId, diff --git a/sync-service/src/main/resources/application.yml b/sync-service/src/main/resources/application.yml index 68f4702..d4c7146 100644 --- a/sync-service/src/main/resources/application.yml +++ b/sync-service/src/main/resources/application.yml @@ -4,6 +4,9 @@ spring: profiles: active: dev +server: + forward-headers-strategy: framework + integration: dolibarr: base-url: ${DOLIBARR_BASE_URL:https://prestashop.loading.net/dolibarr/api/index.php}