global class UpdateStatuAchievementsBatch implements Database.Batchable<sObject> {
	
	/**
     * コンスタント
     */
    global UpdateStatuAchievementsBatch() {
    }
    
    /**
     * startには、queryを実行、备品Set明细を検索
     */
    global Database.QueryLocator start(Database.BatchableContext BC) {
        return Database.getQueryLocator(
            [select Id, Current_status__c, Last_week__c, X2weeks_ago__c, X3Weeks_ago__c, X4weeks_ago__c, X5weeks_ago__c, Last_Batch_Day__c
               from Statu_Achievements__c
              order by Id]
        );
    }
    
    global void execute(Database.BatchableContext BC, List<SObject> saList) {
    	List<Statu_Achievements__c> updateList = new List<Statu_Achievements__c>();
    	
    	for (SObject obj: saList) {
    		Statu_Achievements__c sa = (Statu_Achievements__c) obj;
    		Date lastweek = sa.Last_Batch_Day__c == null ? Date.today().addDays(-7).toStartOfWeek() : sa.Last_Batch_Day__c.toStartOfWeek();
    		Date todayweek = Date.today().toStartOfWeek();
    		Integer cntweek = lastweek.daysBetween(todayweek) / 7;

    		if (cntweek == 0) {
    			continue;
    		} else if (cntweek == 1) {
    			sa.X5weeks_ago__c = sa.X4weeks_ago__c;
	    		sa.X4weeks_ago__c = sa.X3Weeks_ago__c;
	    		sa.X3Weeks_ago__c = sa.X2weeks_ago__c;
	    		sa.X2weeks_ago__c = sa.Last_week__c;
	    		sa.Last_week__c = sa.Current_status__c;
	    		sa.Last_Batch_Day__c = Date.today();
	    		updateList.add(sa);
    		} else if (cntweek == 2) {
    			sa.X5weeks_ago__c = sa.X3weeks_ago__c;
	    		sa.X4weeks_ago__c = sa.X2Weeks_ago__c;
	    		sa.X3Weeks_ago__c = sa.Last_week__c;
	    		sa.X2weeks_ago__c = null;
	    		sa.Last_week__c = sa.Current_status__c;
	    		sa.Last_Batch_Day__c = Date.today();
	    		updateList.add(sa);
    		} else if (cntweek == 3) {
    			sa.X5weeks_ago__c = sa.X2Weeks_ago__c;
	    		sa.X4weeks_ago__c = sa.Last_week__c;
	    		sa.X3Weeks_ago__c = null;
	    		sa.X2weeks_ago__c = null;
	    		sa.Last_week__c = sa.Current_status__c;
	    		sa.Last_Batch_Day__c = Date.today();
	    		updateList.add(sa);
    		} else if (cntweek == 4) {
    			sa.X5weeks_ago__c = sa.Last_week__c;
	    		sa.X4weeks_ago__c = null;
	    		sa.X3Weeks_ago__c = null;
	    		sa.X2weeks_ago__c = null;
	    		sa.Last_week__c = sa.Current_status__c;
	    		sa.Last_Batch_Day__c = Date.today();
	    		updateList.add(sa);
    		} else if (cntweek >= 5) {
    			sa.X5weeks_ago__c = null;
	    		sa.X4weeks_ago__c = null;
	    		sa.X3Weeks_ago__c = null;
	    		sa.X2weeks_ago__c = null;
	    		sa.Last_week__c = sa.Current_status__c;
	    		sa.Last_Batch_Day__c = Date.today();
	    		updateList.add(sa);
    		}
    	}
    	
    	if (updateList.size() > 0) update updateList;
    }
    
    global void finish(Database.BatchableContext BC) {
        // 今回はやることないです
    }
    
	
}