2017-06-15 26 views
0

xmlファイルで撮影されたホーイーディーズと休暇日を比較するスクリプトを作成しましたが、休暇を考慮していない理由はわかりません。それは休暇システムを越えると思われる休暇の日に作業ログを作成します。どちらも私のスクリプトと私のxmlファイルの以下のコードは、見ることができます:xmlノードが正しく読み取られない

XML:

<holidays> 
    <holiday type="fixed" name="New year's day" date="01/Jan" duration_seconds="1d"/> 
    <holiday type="fixed" name="Christmas day" date="25/Dec" duration_seconds="1d"/> 
    <holiday type="fixed" name="Boxing day" date="26/Dec" duration_seconds="1d"/> 
    <holiday type="floating" name="Family Day" date="20/Feb/17" duration_seconds="1d"/> 
    <holiday type="floating" name="Good Friday" date="14/Apr/17" duration_seconds="1d"/> 
    <holiday type="floating" name="CENGN Easter day off (only in 2017)" date="17/Apr/17" duration_seconds="1d"/> 
    <holiday type="floating" name="Victoria Day" date="22/May/17" duration_seconds="1d"/> 
    <holiday type="floating" name="Canada day" date="03/Jul/17" duration_seconds="1d"/> 
    <holiday type="floating" name="Civic Holiday" date="07/Aug/17" duration_seconds="1d"/> 
    <holiday type="floating" name="Labor day" date="04/Sep/17" duration_seconds="1d"/> 
    <holiday type="floating" name="Thanksgiving day" date="09/Oct/17" duration_seconds="1d"/> 
</holidays> 

SCRIPT:

import com.onresolve.scriptrunner.runner.ScriptRunnerImpl; 
    import com.onresolve.scriptrunner.runner.customisers.PluginModule; 
    import com.onresolve.scriptrunner.runner.customisers.WithPlugin; 
    import com.atlassian.jira.issue.CustomFieldManager; 
    import com.atlassian.jira.issue.fields.CustomField; 
    import com.atlassian.jira.ComponentManager 
    import com.atlassian.jira.issue.IssueManager; 
    import com.atlassian.jira.issue.Issue; 
    import com.atlassian.jira.issue.MutableIssue; 
    import com.atlassian.jira.issue.customfields.manager.OptionsManager 
    import com.onresolve.scriptrunner.runner.ScriptRunnerImpl 
    import com.onresolve.scriptrunner.runner.customisers.PluginModule 
    import com.onresolve.scriptrunner.runner.customisers.WithPlugin 
    import java.lang.Object 
    import com.atlassian.jira.issue.worklog.WorklogImpl2 
    import java.text.SimpleDateFormat 
    import com.atlassian.crowd.embedded.api.User 
    import com.atlassian.jira.component.ComponentAccessor 
    import com.atlassian.jira.issue.worklog.DefaultWorklogManager 
    import com.atlassian.jira.security.roles.ProjectRoleManager 
    import com.atlassian.jira.issue.worklog.Worklog 
    import com.atlassian.jira.datetime.LocalDate 
    import org.apache.commons.lang.RandomStringUtils 
    import groovy.xml.MarkupBuilder 
    import groovy.util.* 
    import groovy.xml.MarkupBuilder 
    import javax.xml.parsers.DocumentBuilder; 
    import javax.xml.parsers.DocumentBuilderFactory; 
    import javax.xml.xpath.* 
    import org.w3c.dom.Document 
    import org.w3c.dom.Element 
    import org.w3c.dom.NodeList 


    def componentManager = ComponentManager.getInstance() 
    def customFieldManager = ComponentAccessor.getCustomFieldManager() 
    def cfend = customFieldManager.getCustomFieldObjectByName("End Date") 
    def cfstart = customFieldManager.getCustomFieldObjectByName("Start Date") 
    def cfdays = customFieldManager.getCustomFieldObjectByName("Used vacation 
    days") 
    def reporter = issue.reporter.name 
    def worklogManager = ComponentAccessor.getWorklogManager(); 

    String f = new File('/var/atlassian/application- 
    data/jira_7.3.1/import/holidays.xml') 

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder db = dbf.newDocumentBuilder(); 
    Document doc = db.parse(f); 
    doc.getDocumentElement().normalize(); 

    //Take customfield date object and change it to days 
    int days = (issue.getCustomFieldValue(cfdays) as int)//return the number 
    of days 


    ProjectRoleManager projectRoleManager = 
    ComponentManager.getComponentInstanceOfType(ProjectRoleManager.class) as 
    ProjectRoleManager 
    def UsersRole = projectRoleManager.getProjectRole("Users") 
    long timespent = 27000 
    int counter = 0; 
    int check = 0; 

    for(int i=0; check == 0 ;i++){ 
     String hd = null; 
     int c2 =0; 
     int c =0; 
     NodeList nodeLst = doc.getElementsByTagName("holiday"); 
     int d1 = ((issue.getCustomFieldValue(cfstart) as Date) + 
     i).getDate() 
     int m1 = ((issue.getCustomFieldValue (cfstart) as Date) + 
     i).getMonth() 

     if(m1 == 0) 
      hd = d1+"/Jan" 
    else if(m1 == 1) 
      hd = d1+"/Feb" 
    else if(m1 == 2) 
      hd = d1+"/March" 
    else if(m1 == 3) 
      hd = d1+"/Apr" 
    else if(m1 == 4) 
      hd = d1+"/May" 
    else if(m1 == 5) 
      hd = d1+"/Jun" 
    else if(m1 == 6) 
      hd = d1+"/Jul" 
    else if(m1 == 7) 
      hd = d1+"/Aug" 
    else if(m1 == 8) 
      hd = d1+"/Sep" 
    else if(m1 ==9) 
      hd = d1+"/Oct" 
    else if(m1 == 10) 
      hd = d1+"/Nov" 
    else{ 
      hd = d1+"/Dec" 
    } 

    for (int j = 0; j < nodeLst.getLength()-1; j++){ 
     c=0 
     Element dateElement = (Element) nodeLst.item(j) 
     String hd2 = 
     dateElement.getAttributes().getNamedItem("date").getNodeValue() 
     for(int k =0; k<hd.length()-1;k++){ 
      hd[k]==hd2[k] 
      c++ 
      if (c==hd.length()) 
       c2 = 1; 
     } 

} 
      //If the date is a holiday 
      if(c2 ==1){} 

      //Checks if it is sunday 
    else if(((issue.getCustomFieldValue(cfstart) as Date) + i).getDay() == 0){ 
} 
      //Checks if it is Saturday 
else if(((issue.getCustomFieldValue(cfstart) as Date) + i).getDay() == 6){ 
} 
     //Any other day in the week  
else{ 
    def worklog = new WorklogImpl2(issue, null, issue.reporter.name, 
    issue.summary, (issue.getCustomFieldValue(cfstart) as Date) + i, null, 
    null,timespent, UsersRole) 
      worklogManager.create(issue.reporter, worklog, 0L, true) 
      counter++ 
} 

    if(days == counter){ 
     check =1; 
    } 
} 

    return 0; 

私は開始日がフィールド上から引っ張られていることを知っていて、私が知っていますxmlファイルが認識されることを確認します。私はちょうどそのXMLファイルから休暇日を引っ張っているかどうか、または私の論理に問題がある場合はわからない

答えて

0

私は任意の時間を無駄にして申し訳ありません。私はそれが働くようになった、それは単なる論理的なミスでした。誰でもこのスクリプトが必要な場合は、JIRAのScriptrunnerで週末や休日を避ける作業ログを作成するために使用できます。これにより、休日のリストがファイルから取り出されます。

import com.onresolve.scriptrunner.runner.ScriptRunnerImpl; 
import com.onresolve.scriptrunner.runner.customisers.PluginModule; 
import com.onresolve.scriptrunner.runner.customisers.WithPlugin; 
import com.atlassian.jira.issue.CustomFieldManager; 
import com.atlassian.jira.issue.fields.CustomField; 
import com.atlassian.jira.ComponentManager 
import com.atlassian.jira.issue.IssueManager; 
import com.atlassian.jira.issue.Issue; 
import com.atlassian.jira.issue.MutableIssue; 
import com.atlassian.jira.issue.customfields.manager.OptionsManager 
import com.onresolve.scriptrunner.runner.ScriptRunnerImpl 
import com.onresolve.scriptrunner.runner.customisers.PluginModule 
import com.onresolve.scriptrunner.runner.customisers.WithPlugin 
import java.lang.Object 
import com.atlassian.jira.issue.worklog.WorklogImpl2 
import java.text.SimpleDateFormat 
import com.atlassian.crowd.embedded.api.User 
import com.atlassian.jira.component.ComponentAccessor 
import com.atlassian.jira.issue.worklog.DefaultWorklogManager 
import com.atlassian.jira.security.roles.ProjectRoleManager 
import com.atlassian.jira.issue.worklog.Worklog 
import com.atlassian.jira.datetime.LocalDate 
import org.apache.commons.lang.RandomStringUtils 
import groovy.xml.MarkupBuilder 
import groovy.util.* 
import groovy.xml.MarkupBuilder 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.xpath.* 
import org.w3c.dom.Document 
import org.w3c.dom.Element 
import org.w3c.dom.NodeList 


def componentManager = ComponentManager.getInstance() 
def customFieldManager = ComponentAccessor.getCustomFieldManager() 
def cfend = customFieldManager.getCustomFieldObjectByName("End Date") 
def cfstart = customFieldManager.getCustomFieldObjectByName("Start Date") 
def cfdays = customFieldManager.getCustomFieldObjectByName("Used vacation 
days") 
def reporter = issue.reporter.name 
def worklogManager = ComponentAccessor.getWorklogManager(); 

String f = new File('/var/atlassian/application- 
data/jira_7.3.1/import/holidays.xml') 

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
DocumentBuilder db = dbf.newDocumentBuilder(); 
Document doc = db.parse(f); 
doc.getDocumentElement().normalize(); 

//Take customfield date object and change it to days 
int days = (issue.getCustomFieldValue(cfdays) as int)//return the number of 
days 


ProjectRoleManager projectRoleManager = 
ComponentManager.getComponentInstanceOfType(ProjectRoleManager.class) as 
ProjectRoleManager 
def UsersRole = projectRoleManager.getProjectRole("Users") 
long timespent = 27000 
int counter = 0; 
int check = 0; 

    for(int i=0; check == 0 ;i++){ 
     String hd = null; 
     int c2 =0; 
     int c =0; 
     NodeList nodeLst = doc.getElementsByTagName("holiday"); 
     int d1 = ((issue.getCustomFieldValue(cfstart) as Date) + 
     i).getDate() 
     int m1 = ((issue.getCustomFieldValue (cfstart) as Date) + 
     i).getMonth() 

     if(m1 == 0) 
       hd = d1+"/Jan" 
     else if(m1 == 1) 
       hd =d1+"/Feb" 
     else if(m1 == 2) 
       hd = d1+"/Mar" 
     else if(m1 == 3) 
       hd = d1+"/Apr" 
     else if(m1 == 4) 
       hd = d1+"/May" 
     else if(m1 == 5) 
       hd = d1+"/Jun" 
     else if(m1 == 6) 
       hd = d1+"/Jul" 
     else if(m1 == 7) 
       hd = d1+"/Aug" 
     else if(m1 == 8) 
       hd = d1+"/Sep" 
     else if(m1 ==9) 
       hd = d1+"/Oct" 
     else if(m1 == 10) 
       hd = d1+"/Nov" 
     else{ 
       hd = d1+"/Dec" 
     } 

     for (int j = 0; j < nodeLst.getLength()-1; j++){ 
      c=0 
      Element dateElement = (Element) nodeLst.item(j) 
      String hd2 = 
      dateElement.getAttributes().getNamedItem("date").getNodeValue() 

      for(int k =0; k<hd.length()-1;k++){ 
       if(hd2[0]=="0"){ 
        if(hd[k]==hd2[k+1]){ 
         c++ 
        } 
        } 
       else{ 
        if(hd[k]==hd2[k]){ 
         c++ 
        } 
       } 
       if (c==hd.length()-1) 
        c2 = 1; 
      } 

    } 
     //If the date is a holiday 
     if(c2 ==1){} 

     //Checks if it is sunday 
     else if(((issue.getCustomFieldValue(cfstart) as Date) + i).getDay() 
     == 0){ 
     } 
     //Checks if it is Saturday 
     else if(((issue.getCustomFieldValue(cfstart) as Date) + i).getDay() == 
     6){ 
     } 
//Any other day in the week  
    else{ 
     def worklog = new WorklogImpl2(issue, null, issue.reporter.name, 
     issue.summary, (issue.getCustomFieldValue(cfstart) as Date) + i, 
     null,null,timespent, UsersRole) 
     worklogManager.create(issue.reporter, worklog, 0L, true) 
     counter++ 
    } 

    if(days == counter){ 
     check =1; 
    } 
} 

return 0; 
関連する問題