function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Mark Z DeanMark Z Dean 

Apex Specialist: Ingtegration Error - Step 2

Folks, 
I am doing step 2 in Apex Specialist superbadge. I passed the challenge but when I run the class from Anonymous Apex, it works fine and it creates the records. When I re-run it, instead of just updating existing records, it creates tens of duplicates. Please help as I am losing sleep over this and its already past midnight :)
public with sharing class WarehouseCalloutService {
	
	 private static final String WAREHOUSE_URL = 'https://th-superbadge-apex.herokuapp.com/equipment';
    
    // complete this method to make the callout (using @future) to the
    // REST endpoint and update equipment on hand.
    @future(callout=true)
    public static void runWarehouseEquipmentSync(){
        
    	List<Object> m;
    	List<Product2> ListtoUpdate = new List<Product2>();

    	List<Product2> prod = [select id, Name, Maintenance_Cycle__c, Lifespan_Months__c,	Current_Inventory__c, 
    								Replacement_Part__c, Warehouse_SKU__c, Cost__c
    							from Product2
								where isActive = true
								and Warehouse_SKU__c != null];
								
		System.debug('Size of query is ' + prod.size());
		Http http = new Http();
    	HttpRequest request = new HttpRequest();
    	request.setEndpoint(WAREHOUSE_URL);
    	request.setMethod('GET');
    	HttpResponse response = Http.send(request);

    	if(response.getStatusCode() == 200)
    		m = (List<Object>) JSON.deserializeUntyped(response.getBody());
    	
		for(Object i : m){
    		Map<String, Object> l 	=  (Map<String, Object>) i;
    		String ExID 			= (String) l.get('_id');
    		Boolean Replacement 	= (Boolean) l.get('replacement');
    		Integer Quantity 		= (Integer) l.get('quantity');
    		String NameofProd		= (String) l.get('name');
    		Decimal MaintPeriod 	= (Decimal) l.get('maintenanceperiod');
    		Integer Lifespan		= (Integer) l.get('lifespan'); 
    		Integer Cost 			= (Integer) l.get('cost');
    		String Sku 				= (String) l.get('sku');
    		System.debug(ExID);			
				
    		for(Product2 p : prod){
    			if(Sku == p.Warehouse_SKU__c){
    				p.Lifespan_Months__c 		= Lifespan;
    				p.Current_Inventory__c 		= Quantity;
    				p.Cost__c					= Cost;
    				p.Maintenance_Cycle__c 		= MaintPeriod;
    			//	p.Warehouse_SKU__c			= Sku;
    				p.Replacement_Part__c       = Replacement;
    				System.debug(prod);
    				ListtoUpdate.add(p);  				 
    						}
    			else {

    				Product2 newPr = new Product2(Name=NameofProd, Warehouse_SKU__c= Sku, Lifespan_Months__c=Lifespan,
    											  Current_Inventory__c = Quantity, Cost__c = Cost,
    											  Maintenance_Cycle__c = MaintPeriod, Replacement_Part__c=Replacement, isActive = TRUE);
    				ListtoUpdate.add(newPr);
    			}
    				
					}
    			}
    		upsert ListtoUpdate;
    		}

   }

This is how the JSON looks like:
[{"_id":"55d66226726b611100aaf741","replacement":false,"quantity":5,"name":"Generator 1000 kW","maintenanceperiod":365,"lifespan":120,"cost":5000,"sku":"100003"},{"_id":"55d66226726b611100aaf742","replacement":true,"quantity":183,"name":"Cooling Fan","maintenanceperiod":0,"lifespan":0,"cost":300,"sku":"100004"},{"_id":"55d66226726b611100aaf743","replacement":true,"quantity":143,"name":"Fuse 20A","maintenanceperiod":0,"lifespan":0,"cost":22,"sku":"100005"},{"_id":"55d66226726b611100aaf744","replacement":false,"quantity":5,"name":"Generator 2000 kw","maintenanceperiod":365,"lifespan":120,"cost":6000,"sku":"100006"},{"_id":"55d66226726b611100aaf745","replacement":true,"quantity":142,"name":"Fuse 25A","maintenanceperiod":0,"lifespan":0,"cost":28,"sku":"100007"},{"_id":"55d66226726b611100aaf746","replacement":true,"quantity":122,"name":"Fuse 13A","maintenanceperiod":0,"lifespan":0,"cost":10,"sku":"100008"},{"_id":"55d66226726b611100aaf747","replacement":true,"quantity":90,"name":"Ball Valve 10 cm","maintenanceperiod":0,"lifespan":0,"cost":50,"sku":"100009"},{"_id":"55d66226726b611100aaf748","replacement":false,"quantity":2,"name":"Converter","maintenanceperiod":180,"lifespan":120,"cost":3000,"sku":"100010"},{"_id":"55d66226726b611100aaf749","replacement":true,"quantity":75,"name":"Ball Valve 8 cm","maintenanceperiod":0,"lifespan":0,"cost":42,"sku":"100011"},{"_id":"55d66226726b611100aaf74a","replacement":true,"quantity":100,"name":"Breaker 25A","maintenanceperiod":0,"lifespan":0,"cost":30,"sku":"100012"},{"_id":"55d66226726b611100aaf74b","replacement":true,"quantity":150,"name":"Switch","maintenanceperiod":0,"lifespan":0,"cost":100,"sku":"100013"},{"_id":"55d66226726b611100aaf74c","replacement":true,"quantity":200,"name":"Ball Valve 5 cm","maintenanceperiod":0,"lifespan":0,"cost":30,"sku":"100014"},{"_id":"55d66226726b611100aaf74d","replacement":false,"quantity":8,"name":"UPS 3000 VA","maintenanceperiod":180,"lifespan":60,"cost":1600,"sku":"100015"},{"_id":"55d66226726b611100aaf74e","replacement":false,"quantity":10,"name":"UPS 1000 VA","maintenanceperiod":180,"lifespan":48,"cost":1000,"sku":"100016"},{"_id":"55d66226726b611100aaf74f","replacement":true,"quantity":180,"name":"Breaker 8A","maintenanceperiod":0,"lifespan":0,"cost":10,"sku":"100017"},{"_id":"55d66226726b611100aaf750","replacement":false,"quantity":2,"name":"Cooling Tower","maintenanceperiod":365,"lifespan":120,"cost":10000,"sku":"100018"},{"_id":"55d66226726b611100aaf751","replacement":true,"quantity":165,"name":"Motor","maintenanceperiod":0,"lifespan":0,"cost":150,"sku":"100019"},{"_id":"55d66226726b611100aaf752","replacement":true,"quantity":210,"name":"Breaker 13A","maintenanceperiod":0,"lifespan":0,"cost":20,"sku":"100020"},{"_id":"55d66226726b611100aaf753","replacement":true,"quantity":100,"name":"Radiator Pump","maintenanceperiod":0,"lifespan":0,"cost":500,"sku":"100021"},{"_id":"55d66226726b611100aaf754","replacement":true,"quantity":129,"name":"Breaker 20A","maintenanceperiod":0,"lifespan":0,"cost":25,"sku":"100022"},{"_id":"55d66226726b611100aaf73f","replacement":false,"quantity":10,"name":"UPS 2000 VA","maintenanceperiod":180,"lifespan":60,"cost":1350,"sku":"100001"},{"_id":"55d66226726b611100aaf740","replacement":true,"quantity":194,"name":"Fuse 8A","maintenanceperiod":0,"lifespan":0,"cost":5,"sku":"100002"}]

Many thanks...


 
Mark Z DeanMark Z Dean
Thanks Nagendra...I have already completed the challenge but I am trying to figure out why its creating duplicates. Still looking for help on that...

Your code doesn't follow all the requirements - upsert is what required and not insert although the challenge will still pass because its looking for the scheduled apex job it appears.