001package org.hl7.fhir.r4.model;
002
003import java.math.BigDecimal;
004
005/*
006  Copyright (c) 2011+, HL7, Inc.
007  All rights reserved.
008  
009  Redistribution and use in source and binary forms, with or without modification, 
010  are permitted provided that the following conditions are met:
011  
012   * Redistributions of source code must retain the above copyright notice, this 
013     list of conditions and the following disclaimer.
014   * Redistributions in binary form must reproduce the above copyright notice, 
015     this list of conditions and the following disclaimer in the documentation 
016     and/or other materials provided with the distribution.
017   * Neither the name of HL7 nor the names of its contributors may be used to 
018     endorse or promote products derived from this software without specific 
019     prior written permission.
020  
021  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
022  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
023  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
024  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
025  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
026  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
027  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
028  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
029  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
030  POSSIBILITY OF SUCH DAMAGE.
031  
032*/
033
034// Generated on Tue, May 12, 2020 07:26+1000 for FHIR v4.0.1
035import java.util.ArrayList;
036import java.util.Date;
037import java.util.List;
038
039import org.hl7.fhir.exceptions.FHIRException;
040import org.hl7.fhir.instance.model.api.IBaseBackboneElement;
041import org.hl7.fhir.utilities.Utilities;
042
043import ca.uhn.fhir.model.api.annotation.Block;
044import ca.uhn.fhir.model.api.annotation.Child;
045import ca.uhn.fhir.model.api.annotation.Description;
046import ca.uhn.fhir.model.api.annotation.ResourceDef;
047import ca.uhn.fhir.model.api.annotation.SearchParamDefinition;
048
049/**
050 * A provider issued list of professional services and products which have been
051 * provided, or are to be provided, to a patient which is sent to an insurer for
052 * reimbursement.
053 */
054@ResourceDef(name = "Claim", profile = "http://hl7.org/fhir/StructureDefinition/Claim")
055public class Claim extends DomainResource {
056
057  public enum ClaimStatus {
058    /**
059     * The instance is currently in-force.
060     */
061    ACTIVE,
062    /**
063     * The instance is withdrawn, rescinded or reversed.
064     */
065    CANCELLED,
066    /**
067     * A new instance the contents of which is not complete.
068     */
069    DRAFT,
070    /**
071     * The instance was entered in error.
072     */
073    ENTEREDINERROR,
074    /**
075     * added to help the parsers with the generic types
076     */
077    NULL;
078
079    public static ClaimStatus fromCode(String codeString) throws FHIRException {
080      if (codeString == null || "".equals(codeString))
081        return null;
082      if ("active".equals(codeString))
083        return ACTIVE;
084      if ("cancelled".equals(codeString))
085        return CANCELLED;
086      if ("draft".equals(codeString))
087        return DRAFT;
088      if ("entered-in-error".equals(codeString))
089        return ENTEREDINERROR;
090      if (Configuration.isAcceptInvalidEnums())
091        return null;
092      else
093        throw new FHIRException("Unknown ClaimStatus code '" + codeString + "'");
094    }
095
096    public String toCode() {
097      switch (this) {
098      case ACTIVE:
099        return "active";
100      case CANCELLED:
101        return "cancelled";
102      case DRAFT:
103        return "draft";
104      case ENTEREDINERROR:
105        return "entered-in-error";
106      case NULL:
107        return null;
108      default:
109        return "?";
110      }
111    }
112
113    public String getSystem() {
114      switch (this) {
115      case ACTIVE:
116        return "http://hl7.org/fhir/fm-status";
117      case CANCELLED:
118        return "http://hl7.org/fhir/fm-status";
119      case DRAFT:
120        return "http://hl7.org/fhir/fm-status";
121      case ENTEREDINERROR:
122        return "http://hl7.org/fhir/fm-status";
123      case NULL:
124        return null;
125      default:
126        return "?";
127      }
128    }
129
130    public String getDefinition() {
131      switch (this) {
132      case ACTIVE:
133        return "The instance is currently in-force.";
134      case CANCELLED:
135        return "The instance is withdrawn, rescinded or reversed.";
136      case DRAFT:
137        return "A new instance the contents of which is not complete.";
138      case ENTEREDINERROR:
139        return "The instance was entered in error.";
140      case NULL:
141        return null;
142      default:
143        return "?";
144      }
145    }
146
147    public String getDisplay() {
148      switch (this) {
149      case ACTIVE:
150        return "Active";
151      case CANCELLED:
152        return "Cancelled";
153      case DRAFT:
154        return "Draft";
155      case ENTEREDINERROR:
156        return "Entered in Error";
157      case NULL:
158        return null;
159      default:
160        return "?";
161      }
162    }
163  }
164
165  public static class ClaimStatusEnumFactory implements EnumFactory<ClaimStatus> {
166    public ClaimStatus fromCode(String codeString) throws IllegalArgumentException {
167      if (codeString == null || "".equals(codeString))
168        if (codeString == null || "".equals(codeString))
169          return null;
170      if ("active".equals(codeString))
171        return ClaimStatus.ACTIVE;
172      if ("cancelled".equals(codeString))
173        return ClaimStatus.CANCELLED;
174      if ("draft".equals(codeString))
175        return ClaimStatus.DRAFT;
176      if ("entered-in-error".equals(codeString))
177        return ClaimStatus.ENTEREDINERROR;
178      throw new IllegalArgumentException("Unknown ClaimStatus code '" + codeString + "'");
179    }
180
181    public Enumeration<ClaimStatus> fromType(PrimitiveType<?> code) throws FHIRException {
182      if (code == null)
183        return null;
184      if (code.isEmpty())
185        return new Enumeration<ClaimStatus>(this, ClaimStatus.NULL, code);
186      String codeString = code.asStringValue();
187      if (codeString == null || "".equals(codeString))
188        return new Enumeration<ClaimStatus>(this, ClaimStatus.NULL, code);
189      if ("active".equals(codeString))
190        return new Enumeration<ClaimStatus>(this, ClaimStatus.ACTIVE, code);
191      if ("cancelled".equals(codeString))
192        return new Enumeration<ClaimStatus>(this, ClaimStatus.CANCELLED, code);
193      if ("draft".equals(codeString))
194        return new Enumeration<ClaimStatus>(this, ClaimStatus.DRAFT, code);
195      if ("entered-in-error".equals(codeString))
196        return new Enumeration<ClaimStatus>(this, ClaimStatus.ENTEREDINERROR, code);
197      throw new FHIRException("Unknown ClaimStatus code '" + codeString + "'");
198    }
199
200    public String toCode(ClaimStatus code) {
201       if (code == ClaimStatus.NULL)
202           return null;
203       if (code == ClaimStatus.ACTIVE)
204        return "active";
205      if (code == ClaimStatus.CANCELLED)
206        return "cancelled";
207      if (code == ClaimStatus.DRAFT)
208        return "draft";
209      if (code == ClaimStatus.ENTEREDINERROR)
210        return "entered-in-error";
211      return "?";
212   }
213
214    public String toSystem(ClaimStatus code) {
215      return code.getSystem();
216    }
217  }
218
219  public enum Use {
220    /**
221     * The treatment is complete and this represents a Claim for the services.
222     */
223    CLAIM,
224    /**
225     * The treatment is proposed and this represents a Pre-authorization for the
226     * services.
227     */
228    PREAUTHORIZATION,
229    /**
230     * The treatment is proposed and this represents a Pre-determination for the
231     * services.
232     */
233    PREDETERMINATION,
234    /**
235     * added to help the parsers with the generic types
236     */
237    NULL;
238
239    public static Use fromCode(String codeString) throws FHIRException {
240      if (codeString == null || "".equals(codeString))
241        return null;
242      if ("claim".equals(codeString))
243        return CLAIM;
244      if ("preauthorization".equals(codeString))
245        return PREAUTHORIZATION;
246      if ("predetermination".equals(codeString))
247        return PREDETERMINATION;
248      if (Configuration.isAcceptInvalidEnums())
249        return null;
250      else
251        throw new FHIRException("Unknown Use code '" + codeString + "'");
252    }
253
254    public String toCode() {
255      switch (this) {
256      case CLAIM:
257        return "claim";
258      case PREAUTHORIZATION:
259        return "preauthorization";
260      case PREDETERMINATION:
261        return "predetermination";
262      case NULL:
263        return null;
264      default:
265        return "?";
266      }
267    }
268
269    public String getSystem() {
270      switch (this) {
271      case CLAIM:
272        return "http://hl7.org/fhir/claim-use";
273      case PREAUTHORIZATION:
274        return "http://hl7.org/fhir/claim-use";
275      case PREDETERMINATION:
276        return "http://hl7.org/fhir/claim-use";
277      case NULL:
278        return null;
279      default:
280        return "?";
281      }
282    }
283
284    public String getDefinition() {
285      switch (this) {
286      case CLAIM:
287        return "The treatment is complete and this represents a Claim for the services.";
288      case PREAUTHORIZATION:
289        return "The treatment is proposed and this represents a Pre-authorization for the services.";
290      case PREDETERMINATION:
291        return "The treatment is proposed and this represents a Pre-determination for the services.";
292      case NULL:
293        return null;
294      default:
295        return "?";
296      }
297    }
298
299    public String getDisplay() {
300      switch (this) {
301      case CLAIM:
302        return "Claim";
303      case PREAUTHORIZATION:
304        return "Preauthorization";
305      case PREDETERMINATION:
306        return "Predetermination";
307      case NULL:
308        return null;
309      default:
310        return "?";
311      }
312    }
313  }
314
315  public static class UseEnumFactory implements EnumFactory<Use> {
316    public Use fromCode(String codeString) throws IllegalArgumentException {
317      if (codeString == null || "".equals(codeString))
318        if (codeString == null || "".equals(codeString))
319          return null;
320      if ("claim".equals(codeString))
321        return Use.CLAIM;
322      if ("preauthorization".equals(codeString))
323        return Use.PREAUTHORIZATION;
324      if ("predetermination".equals(codeString))
325        return Use.PREDETERMINATION;
326      throw new IllegalArgumentException("Unknown Use code '" + codeString + "'");
327    }
328
329    public Enumeration<Use> fromType(PrimitiveType<?> code) throws FHIRException {
330      if (code == null)
331        return null;
332      if (code.isEmpty())
333        return new Enumeration<Use>(this, Use.NULL, code);
334      String codeString = code.asStringValue();
335      if (codeString == null || "".equals(codeString))
336        return new Enumeration<Use>(this, Use.NULL, code);
337      if ("claim".equals(codeString))
338        return new Enumeration<Use>(this, Use.CLAIM, code);
339      if ("preauthorization".equals(codeString))
340        return new Enumeration<Use>(this, Use.PREAUTHORIZATION, code);
341      if ("predetermination".equals(codeString))
342        return new Enumeration<Use>(this, Use.PREDETERMINATION, code);
343      throw new FHIRException("Unknown Use code '" + codeString + "'");
344    }
345
346    public String toCode(Use code) {
347       if (code == Use.NULL)
348           return null;
349       if (code == Use.CLAIM)
350        return "claim";
351      if (code == Use.PREAUTHORIZATION)
352        return "preauthorization";
353      if (code == Use.PREDETERMINATION)
354        return "predetermination";
355      return "?";
356   }
357
358    public String toSystem(Use code) {
359      return code.getSystem();
360    }
361  }
362
363  @Block()
364  public static class RelatedClaimComponent extends BackboneElement implements IBaseBackboneElement {
365    /**
366     * Reference to a related claim.
367     */
368    @Child(name = "claim", type = { Claim.class }, order = 1, min = 0, max = 1, modifier = false, summary = false)
369    @Description(shortDefinition = "Reference to the related claim", formalDefinition = "Reference to a related claim.")
370    protected Reference claim;
371
372    /**
373     * The actual object that is the target of the reference (Reference to a related
374     * claim.)
375     */
376    protected Claim claimTarget;
377
378    /**
379     * A code to convey how the claims are related.
380     */
381    @Child(name = "relationship", type = {
382        CodeableConcept.class }, order = 2, min = 0, max = 1, modifier = false, summary = false)
383    @Description(shortDefinition = "How the reference claim is related", formalDefinition = "A code to convey how the claims are related.")
384    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/related-claim-relationship")
385    protected CodeableConcept relationship;
386
387    /**
388     * An alternate organizational reference to the case or file to which this
389     * particular claim pertains.
390     */
391    @Child(name = "reference", type = {
392        Identifier.class }, order = 3, min = 0, max = 1, modifier = false, summary = false)
393    @Description(shortDefinition = "File or case reference", formalDefinition = "An alternate organizational reference to the case or file to which this particular claim pertains.")
394    protected Identifier reference;
395
396    private static final long serialVersionUID = -379338905L;
397
398    /**
399     * Constructor
400     */
401    public RelatedClaimComponent() {
402      super();
403    }
404
405    /**
406     * @return {@link #claim} (Reference to a related claim.)
407     */
408    public Reference getClaim() {
409      if (this.claim == null)
410        if (Configuration.errorOnAutoCreate())
411          throw new Error("Attempt to auto-create RelatedClaimComponent.claim");
412        else if (Configuration.doAutoCreate())
413          this.claim = new Reference(); // cc
414      return this.claim;
415    }
416
417    public boolean hasClaim() {
418      return this.claim != null && !this.claim.isEmpty();
419    }
420
421    /**
422     * @param value {@link #claim} (Reference to a related claim.)
423     */
424    public RelatedClaimComponent setClaim(Reference value) {
425      this.claim = value;
426      return this;
427    }
428
429    /**
430     * @return {@link #claim} The actual object that is the target of the reference.
431     *         The reference library doesn't populate this, but you can use it to
432     *         hold the resource if you resolve it. (Reference to a related claim.)
433     */
434    public Claim getClaimTarget() {
435      if (this.claimTarget == null)
436        if (Configuration.errorOnAutoCreate())
437          throw new Error("Attempt to auto-create RelatedClaimComponent.claim");
438        else if (Configuration.doAutoCreate())
439          this.claimTarget = new Claim(); // aa
440      return this.claimTarget;
441    }
442
443    /**
444     * @param value {@link #claim} The actual object that is the target of the
445     *              reference. The reference library doesn't use these, but you can
446     *              use it to hold the resource if you resolve it. (Reference to a
447     *              related claim.)
448     */
449    public RelatedClaimComponent setClaimTarget(Claim value) {
450      this.claimTarget = value;
451      return this;
452    }
453
454    /**
455     * @return {@link #relationship} (A code to convey how the claims are related.)
456     */
457    public CodeableConcept getRelationship() {
458      if (this.relationship == null)
459        if (Configuration.errorOnAutoCreate())
460          throw new Error("Attempt to auto-create RelatedClaimComponent.relationship");
461        else if (Configuration.doAutoCreate())
462          this.relationship = new CodeableConcept(); // cc
463      return this.relationship;
464    }
465
466    public boolean hasRelationship() {
467      return this.relationship != null && !this.relationship.isEmpty();
468    }
469
470    /**
471     * @param value {@link #relationship} (A code to convey how the claims are
472     *              related.)
473     */
474    public RelatedClaimComponent setRelationship(CodeableConcept value) {
475      this.relationship = value;
476      return this;
477    }
478
479    /**
480     * @return {@link #reference} (An alternate organizational reference to the case
481     *         or file to which this particular claim pertains.)
482     */
483    public Identifier getReference() {
484      if (this.reference == null)
485        if (Configuration.errorOnAutoCreate())
486          throw new Error("Attempt to auto-create RelatedClaimComponent.reference");
487        else if (Configuration.doAutoCreate())
488          this.reference = new Identifier(); // cc
489      return this.reference;
490    }
491
492    public boolean hasReference() {
493      return this.reference != null && !this.reference.isEmpty();
494    }
495
496    /**
497     * @param value {@link #reference} (An alternate organizational reference to the
498     *              case or file to which this particular claim pertains.)
499     */
500    public RelatedClaimComponent setReference(Identifier value) {
501      this.reference = value;
502      return this;
503    }
504
505    protected void listChildren(List<Property> children) {
506      super.listChildren(children);
507      children.add(new Property("claim", "Reference(Claim)", "Reference to a related claim.", 0, 1, claim));
508      children.add(new Property("relationship", "CodeableConcept", "A code to convey how the claims are related.", 0, 1,
509          relationship));
510      children.add(new Property("reference", "Identifier",
511          "An alternate organizational reference to the case or file to which this particular claim pertains.", 0, 1,
512          reference));
513    }
514
515    @Override
516    public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
517      switch (_hash) {
518      case 94742588:
519        /* claim */ return new Property("claim", "Reference(Claim)", "Reference to a related claim.", 0, 1, claim);
520      case -261851592:
521        /* relationship */ return new Property("relationship", "CodeableConcept",
522            "A code to convey how the claims are related.", 0, 1, relationship);
523      case -925155509:
524        /* reference */ return new Property("reference", "Identifier",
525            "An alternate organizational reference to the case or file to which this particular claim pertains.", 0, 1,
526            reference);
527      default:
528        return super.getNamedProperty(_hash, _name, _checkValid);
529      }
530
531    }
532
533    @Override
534    public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
535      switch (hash) {
536      case 94742588:
537        /* claim */ return this.claim == null ? new Base[0] : new Base[] { this.claim }; // Reference
538      case -261851592:
539        /* relationship */ return this.relationship == null ? new Base[0] : new Base[] { this.relationship }; // CodeableConcept
540      case -925155509:
541        /* reference */ return this.reference == null ? new Base[0] : new Base[] { this.reference }; // Identifier
542      default:
543        return super.getProperty(hash, name, checkValid);
544      }
545
546    }
547
548    @Override
549    public Base setProperty(int hash, String name, Base value) throws FHIRException {
550      switch (hash) {
551      case 94742588: // claim
552        this.claim = castToReference(value); // Reference
553        return value;
554      case -261851592: // relationship
555        this.relationship = castToCodeableConcept(value); // CodeableConcept
556        return value;
557      case -925155509: // reference
558        this.reference = castToIdentifier(value); // Identifier
559        return value;
560      default:
561        return super.setProperty(hash, name, value);
562      }
563
564    }
565
566    @Override
567    public Base setProperty(String name, Base value) throws FHIRException {
568      if (name.equals("claim")) {
569        this.claim = castToReference(value); // Reference
570      } else if (name.equals("relationship")) {
571        this.relationship = castToCodeableConcept(value); // CodeableConcept
572      } else if (name.equals("reference")) {
573        this.reference = castToIdentifier(value); // Identifier
574      } else
575        return super.setProperty(name, value);
576      return value;
577    }
578
579  @Override
580  public void removeChild(String name, Base value) throws FHIRException {
581      if (name.equals("claim")) {
582        this.claim = null;
583      } else if (name.equals("relationship")) {
584        this.relationship = null;
585      } else if (name.equals("reference")) {
586        this.reference = null;
587      } else
588        super.removeChild(name, value);
589      
590    }
591
592    @Override
593    public Base makeProperty(int hash, String name) throws FHIRException {
594      switch (hash) {
595      case 94742588:
596        return getClaim();
597      case -261851592:
598        return getRelationship();
599      case -925155509:
600        return getReference();
601      default:
602        return super.makeProperty(hash, name);
603      }
604
605    }
606
607    @Override
608    public String[] getTypesForProperty(int hash, String name) throws FHIRException {
609      switch (hash) {
610      case 94742588:
611        /* claim */ return new String[] { "Reference" };
612      case -261851592:
613        /* relationship */ return new String[] { "CodeableConcept" };
614      case -925155509:
615        /* reference */ return new String[] { "Identifier" };
616      default:
617        return super.getTypesForProperty(hash, name);
618      }
619
620    }
621
622    @Override
623    public Base addChild(String name) throws FHIRException {
624      if (name.equals("claim")) {
625        this.claim = new Reference();
626        return this.claim;
627      } else if (name.equals("relationship")) {
628        this.relationship = new CodeableConcept();
629        return this.relationship;
630      } else if (name.equals("reference")) {
631        this.reference = new Identifier();
632        return this.reference;
633      } else
634        return super.addChild(name);
635    }
636
637    public RelatedClaimComponent copy() {
638      RelatedClaimComponent dst = new RelatedClaimComponent();
639      copyValues(dst);
640      return dst;
641    }
642
643    public void copyValues(RelatedClaimComponent dst) {
644      super.copyValues(dst);
645      dst.claim = claim == null ? null : claim.copy();
646      dst.relationship = relationship == null ? null : relationship.copy();
647      dst.reference = reference == null ? null : reference.copy();
648    }
649
650    @Override
651    public boolean equalsDeep(Base other_) {
652      if (!super.equalsDeep(other_))
653        return false;
654      if (!(other_ instanceof RelatedClaimComponent))
655        return false;
656      RelatedClaimComponent o = (RelatedClaimComponent) other_;
657      return compareDeep(claim, o.claim, true) && compareDeep(relationship, o.relationship, true)
658          && compareDeep(reference, o.reference, true);
659    }
660
661    @Override
662    public boolean equalsShallow(Base other_) {
663      if (!super.equalsShallow(other_))
664        return false;
665      if (!(other_ instanceof RelatedClaimComponent))
666        return false;
667      RelatedClaimComponent o = (RelatedClaimComponent) other_;
668      return true;
669    }
670
671    public boolean isEmpty() {
672      return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(claim, relationship, reference);
673    }
674
675    public String fhirType() {
676      return "Claim.related";
677
678    }
679
680  }
681
682  @Block()
683  public static class PayeeComponent extends BackboneElement implements IBaseBackboneElement {
684    /**
685     * Type of Party to be reimbursed: subscriber, provider, other.
686     */
687    @Child(name = "type", type = {
688        CodeableConcept.class }, order = 1, min = 1, max = 1, modifier = false, summary = false)
689    @Description(shortDefinition = "Category of recipient", formalDefinition = "Type of Party to be reimbursed: subscriber, provider, other.")
690    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/payeetype")
691    protected CodeableConcept type;
692
693    /**
694     * Reference to the individual or organization to whom any payment will be made.
695     */
696    @Child(name = "party", type = { Practitioner.class, PractitionerRole.class, Organization.class, Patient.class,
697        RelatedPerson.class }, order = 2, min = 0, max = 1, modifier = false, summary = false)
698    @Description(shortDefinition = "Recipient reference", formalDefinition = "Reference to the individual or organization to whom any payment will be made.")
699    protected Reference party;
700
701    /**
702     * The actual object that is the target of the reference (Reference to the
703     * individual or organization to whom any payment will be made.)
704     */
705    protected Resource partyTarget;
706
707    private static final long serialVersionUID = 1609484699L;
708
709    /**
710     * Constructor
711     */
712    public PayeeComponent() {
713      super();
714    }
715
716    /**
717     * Constructor
718     */
719    public PayeeComponent(CodeableConcept type) {
720      super();
721      this.type = type;
722    }
723
724    /**
725     * @return {@link #type} (Type of Party to be reimbursed: subscriber, provider,
726     *         other.)
727     */
728    public CodeableConcept getType() {
729      if (this.type == null)
730        if (Configuration.errorOnAutoCreate())
731          throw new Error("Attempt to auto-create PayeeComponent.type");
732        else if (Configuration.doAutoCreate())
733          this.type = new CodeableConcept(); // cc
734      return this.type;
735    }
736
737    public boolean hasType() {
738      return this.type != null && !this.type.isEmpty();
739    }
740
741    /**
742     * @param value {@link #type} (Type of Party to be reimbursed: subscriber,
743     *              provider, other.)
744     */
745    public PayeeComponent setType(CodeableConcept value) {
746      this.type = value;
747      return this;
748    }
749
750    /**
751     * @return {@link #party} (Reference to the individual or organization to whom
752     *         any payment will be made.)
753     */
754    public Reference getParty() {
755      if (this.party == null)
756        if (Configuration.errorOnAutoCreate())
757          throw new Error("Attempt to auto-create PayeeComponent.party");
758        else if (Configuration.doAutoCreate())
759          this.party = new Reference(); // cc
760      return this.party;
761    }
762
763    public boolean hasParty() {
764      return this.party != null && !this.party.isEmpty();
765    }
766
767    /**
768     * @param value {@link #party} (Reference to the individual or organization to
769     *              whom any payment will be made.)
770     */
771    public PayeeComponent setParty(Reference value) {
772      this.party = value;
773      return this;
774    }
775
776    /**
777     * @return {@link #party} The actual object that is the target of the reference.
778     *         The reference library doesn't populate this, but you can use it to
779     *         hold the resource if you resolve it. (Reference to the individual or
780     *         organization to whom any payment will be made.)
781     */
782    public Resource getPartyTarget() {
783      return this.partyTarget;
784    }
785
786    /**
787     * @param value {@link #party} The actual object that is the target of the
788     *              reference. The reference library doesn't use these, but you can
789     *              use it to hold the resource if you resolve it. (Reference to the
790     *              individual or organization to whom any payment will be made.)
791     */
792    public PayeeComponent setPartyTarget(Resource value) {
793      this.partyTarget = value;
794      return this;
795    }
796
797    protected void listChildren(List<Property> children) {
798      super.listChildren(children);
799      children.add(new Property("type", "CodeableConcept",
800          "Type of Party to be reimbursed: subscriber, provider, other.", 0, 1, type));
801      children.add(new Property("party", "Reference(Practitioner|PractitionerRole|Organization|Patient|RelatedPerson)",
802          "Reference to the individual or organization to whom any payment will be made.", 0, 1, party));
803    }
804
805    @Override
806    public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
807      switch (_hash) {
808      case 3575610:
809        /* type */ return new Property("type", "CodeableConcept",
810            "Type of Party to be reimbursed: subscriber, provider, other.", 0, 1, type);
811      case 106437350:
812        /* party */ return new Property("party",
813            "Reference(Practitioner|PractitionerRole|Organization|Patient|RelatedPerson)",
814            "Reference to the individual or organization to whom any payment will be made.", 0, 1, party);
815      default:
816        return super.getNamedProperty(_hash, _name, _checkValid);
817      }
818
819    }
820
821    @Override
822    public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
823      switch (hash) {
824      case 3575610:
825        /* type */ return this.type == null ? new Base[0] : new Base[] { this.type }; // CodeableConcept
826      case 106437350:
827        /* party */ return this.party == null ? new Base[0] : new Base[] { this.party }; // Reference
828      default:
829        return super.getProperty(hash, name, checkValid);
830      }
831
832    }
833
834    @Override
835    public Base setProperty(int hash, String name, Base value) throws FHIRException {
836      switch (hash) {
837      case 3575610: // type
838        this.type = castToCodeableConcept(value); // CodeableConcept
839        return value;
840      case 106437350: // party
841        this.party = castToReference(value); // Reference
842        return value;
843      default:
844        return super.setProperty(hash, name, value);
845      }
846
847    }
848
849    @Override
850    public Base setProperty(String name, Base value) throws FHIRException {
851      if (name.equals("type")) {
852        this.type = castToCodeableConcept(value); // CodeableConcept
853      } else if (name.equals("party")) {
854        this.party = castToReference(value); // Reference
855      } else
856        return super.setProperty(name, value);
857      return value;
858    }
859
860  @Override
861  public void removeChild(String name, Base value) throws FHIRException {
862      if (name.equals("type")) {
863        this.type = null;
864      } else if (name.equals("party")) {
865        this.party = null;
866      } else
867        super.removeChild(name, value);
868      
869    }
870
871    @Override
872    public Base makeProperty(int hash, String name) throws FHIRException {
873      switch (hash) {
874      case 3575610:
875        return getType();
876      case 106437350:
877        return getParty();
878      default:
879        return super.makeProperty(hash, name);
880      }
881
882    }
883
884    @Override
885    public String[] getTypesForProperty(int hash, String name) throws FHIRException {
886      switch (hash) {
887      case 3575610:
888        /* type */ return new String[] { "CodeableConcept" };
889      case 106437350:
890        /* party */ return new String[] { "Reference" };
891      default:
892        return super.getTypesForProperty(hash, name);
893      }
894
895    }
896
897    @Override
898    public Base addChild(String name) throws FHIRException {
899      if (name.equals("type")) {
900        this.type = new CodeableConcept();
901        return this.type;
902      } else if (name.equals("party")) {
903        this.party = new Reference();
904        return this.party;
905      } else
906        return super.addChild(name);
907    }
908
909    public PayeeComponent copy() {
910      PayeeComponent dst = new PayeeComponent();
911      copyValues(dst);
912      return dst;
913    }
914
915    public void copyValues(PayeeComponent dst) {
916      super.copyValues(dst);
917      dst.type = type == null ? null : type.copy();
918      dst.party = party == null ? null : party.copy();
919    }
920
921    @Override
922    public boolean equalsDeep(Base other_) {
923      if (!super.equalsDeep(other_))
924        return false;
925      if (!(other_ instanceof PayeeComponent))
926        return false;
927      PayeeComponent o = (PayeeComponent) other_;
928      return compareDeep(type, o.type, true) && compareDeep(party, o.party, true);
929    }
930
931    @Override
932    public boolean equalsShallow(Base other_) {
933      if (!super.equalsShallow(other_))
934        return false;
935      if (!(other_ instanceof PayeeComponent))
936        return false;
937      PayeeComponent o = (PayeeComponent) other_;
938      return true;
939    }
940
941    public boolean isEmpty() {
942      return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(type, party);
943    }
944
945    public String fhirType() {
946      return "Claim.payee";
947
948    }
949
950  }
951
952  @Block()
953  public static class CareTeamComponent extends BackboneElement implements IBaseBackboneElement {
954    /**
955     * A number to uniquely identify care team entries.
956     */
957    @Child(name = "sequence", type = {
958        PositiveIntType.class }, order = 1, min = 1, max = 1, modifier = false, summary = false)
959    @Description(shortDefinition = "Order of care team", formalDefinition = "A number to uniquely identify care team entries.")
960    protected PositiveIntType sequence;
961
962    /**
963     * Member of the team who provided the product or service.
964     */
965    @Child(name = "provider", type = { Practitioner.class, PractitionerRole.class,
966        Organization.class }, order = 2, min = 1, max = 1, modifier = false, summary = false)
967    @Description(shortDefinition = "Practitioner or organization", formalDefinition = "Member of the team who provided the product or service.")
968    protected Reference provider;
969
970    /**
971     * The actual object that is the target of the reference (Member of the team who
972     * provided the product or service.)
973     */
974    protected Resource providerTarget;
975
976    /**
977     * The party who is billing and/or responsible for the claimed products or
978     * services.
979     */
980    @Child(name = "responsible", type = {
981        BooleanType.class }, order = 3, min = 0, max = 1, modifier = false, summary = false)
982    @Description(shortDefinition = "Indicator of the lead practitioner", formalDefinition = "The party who is billing and/or responsible for the claimed products or services.")
983    protected BooleanType responsible;
984
985    /**
986     * The lead, assisting or supervising practitioner and their discipline if a
987     * multidisciplinary team.
988     */
989    @Child(name = "role", type = {
990        CodeableConcept.class }, order = 4, min = 0, max = 1, modifier = false, summary = false)
991    @Description(shortDefinition = "Function within the team", formalDefinition = "The lead, assisting or supervising practitioner and their discipline if a multidisciplinary team.")
992    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/claim-careteamrole")
993    protected CodeableConcept role;
994
995    /**
996     * The qualification of the practitioner which is applicable for this service.
997     */
998    @Child(name = "qualification", type = {
999        CodeableConcept.class }, order = 5, min = 0, max = 1, modifier = false, summary = false)
1000    @Description(shortDefinition = "Practitioner credential or specialization", formalDefinition = "The qualification of the practitioner which is applicable for this service.")
1001    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/provider-qualification")
1002    protected CodeableConcept qualification;
1003
1004    private static final long serialVersionUID = 1758966968L;
1005
1006    /**
1007     * Constructor
1008     */
1009    public CareTeamComponent() {
1010      super();
1011    }
1012
1013    /**
1014     * Constructor
1015     */
1016    public CareTeamComponent(PositiveIntType sequence, Reference provider) {
1017      super();
1018      this.sequence = sequence;
1019      this.provider = provider;
1020    }
1021
1022    /**
1023     * @return {@link #sequence} (A number to uniquely identify care team entries.).
1024     *         This is the underlying object with id, value and extensions. The
1025     *         accessor "getSequence" gives direct access to the value
1026     */
1027    public PositiveIntType getSequenceElement() {
1028      if (this.sequence == null)
1029        if (Configuration.errorOnAutoCreate())
1030          throw new Error("Attempt to auto-create CareTeamComponent.sequence");
1031        else if (Configuration.doAutoCreate())
1032          this.sequence = new PositiveIntType(); // bb
1033      return this.sequence;
1034    }
1035
1036    public boolean hasSequenceElement() {
1037      return this.sequence != null && !this.sequence.isEmpty();
1038    }
1039
1040    public boolean hasSequence() {
1041      return this.sequence != null && !this.sequence.isEmpty();
1042    }
1043
1044    /**
1045     * @param value {@link #sequence} (A number to uniquely identify care team
1046     *              entries.). This is the underlying object with id, value and
1047     *              extensions. The accessor "getSequence" gives direct access to
1048     *              the value
1049     */
1050    public CareTeamComponent setSequenceElement(PositiveIntType value) {
1051      this.sequence = value;
1052      return this;
1053    }
1054
1055    /**
1056     * @return A number to uniquely identify care team entries.
1057     */
1058    public int getSequence() {
1059      return this.sequence == null || this.sequence.isEmpty() ? 0 : this.sequence.getValue();
1060    }
1061
1062    /**
1063     * @param value A number to uniquely identify care team entries.
1064     */
1065    public CareTeamComponent setSequence(int value) {
1066      if (this.sequence == null)
1067        this.sequence = new PositiveIntType();
1068      this.sequence.setValue(value);
1069      return this;
1070    }
1071
1072    /**
1073     * @return {@link #provider} (Member of the team who provided the product or
1074     *         service.)
1075     */
1076    public Reference getProvider() {
1077      if (this.provider == null)
1078        if (Configuration.errorOnAutoCreate())
1079          throw new Error("Attempt to auto-create CareTeamComponent.provider");
1080        else if (Configuration.doAutoCreate())
1081          this.provider = new Reference(); // cc
1082      return this.provider;
1083    }
1084
1085    public boolean hasProvider() {
1086      return this.provider != null && !this.provider.isEmpty();
1087    }
1088
1089    /**
1090     * @param value {@link #provider} (Member of the team who provided the product
1091     *              or service.)
1092     */
1093    public CareTeamComponent setProvider(Reference value) {
1094      this.provider = value;
1095      return this;
1096    }
1097
1098    /**
1099     * @return {@link #provider} The actual object that is the target of the
1100     *         reference. The reference library doesn't populate this, but you can
1101     *         use it to hold the resource if you resolve it. (Member of the team
1102     *         who provided the product or service.)
1103     */
1104    public Resource getProviderTarget() {
1105      return this.providerTarget;
1106    }
1107
1108    /**
1109     * @param value {@link #provider} The actual object that is the target of the
1110     *              reference. The reference library doesn't use these, but you can
1111     *              use it to hold the resource if you resolve it. (Member of the
1112     *              team who provided the product or service.)
1113     */
1114    public CareTeamComponent setProviderTarget(Resource value) {
1115      this.providerTarget = value;
1116      return this;
1117    }
1118
1119    /**
1120     * @return {@link #responsible} (The party who is billing and/or responsible for
1121     *         the claimed products or services.). This is the underlying object
1122     *         with id, value and extensions. The accessor "getResponsible" gives
1123     *         direct access to the value
1124     */
1125    public BooleanType getResponsibleElement() {
1126      if (this.responsible == null)
1127        if (Configuration.errorOnAutoCreate())
1128          throw new Error("Attempt to auto-create CareTeamComponent.responsible");
1129        else if (Configuration.doAutoCreate())
1130          this.responsible = new BooleanType(); // bb
1131      return this.responsible;
1132    }
1133
1134    public boolean hasResponsibleElement() {
1135      return this.responsible != null && !this.responsible.isEmpty();
1136    }
1137
1138    public boolean hasResponsible() {
1139      return this.responsible != null && !this.responsible.isEmpty();
1140    }
1141
1142    /**
1143     * @param value {@link #responsible} (The party who is billing and/or
1144     *              responsible for the claimed products or services.). This is the
1145     *              underlying object with id, value and extensions. The accessor
1146     *              "getResponsible" gives direct access to the value
1147     */
1148    public CareTeamComponent setResponsibleElement(BooleanType value) {
1149      this.responsible = value;
1150      return this;
1151    }
1152
1153    /**
1154     * @return The party who is billing and/or responsible for the claimed products
1155     *         or services.
1156     */
1157    public boolean getResponsible() {
1158      return this.responsible == null || this.responsible.isEmpty() ? false : this.responsible.getValue();
1159    }
1160
1161    /**
1162     * @param value The party who is billing and/or responsible for the claimed
1163     *              products or services.
1164     */
1165    public CareTeamComponent setResponsible(boolean value) {
1166      if (this.responsible == null)
1167        this.responsible = new BooleanType();
1168      this.responsible.setValue(value);
1169      return this;
1170    }
1171
1172    /**
1173     * @return {@link #role} (The lead, assisting or supervising practitioner and
1174     *         their discipline if a multidisciplinary team.)
1175     */
1176    public CodeableConcept getRole() {
1177      if (this.role == null)
1178        if (Configuration.errorOnAutoCreate())
1179          throw new Error("Attempt to auto-create CareTeamComponent.role");
1180        else if (Configuration.doAutoCreate())
1181          this.role = new CodeableConcept(); // cc
1182      return this.role;
1183    }
1184
1185    public boolean hasRole() {
1186      return this.role != null && !this.role.isEmpty();
1187    }
1188
1189    /**
1190     * @param value {@link #role} (The lead, assisting or supervising practitioner
1191     *              and their discipline if a multidisciplinary team.)
1192     */
1193    public CareTeamComponent setRole(CodeableConcept value) {
1194      this.role = value;
1195      return this;
1196    }
1197
1198    /**
1199     * @return {@link #qualification} (The qualification of the practitioner which
1200     *         is applicable for this service.)
1201     */
1202    public CodeableConcept getQualification() {
1203      if (this.qualification == null)
1204        if (Configuration.errorOnAutoCreate())
1205          throw new Error("Attempt to auto-create CareTeamComponent.qualification");
1206        else if (Configuration.doAutoCreate())
1207          this.qualification = new CodeableConcept(); // cc
1208      return this.qualification;
1209    }
1210
1211    public boolean hasQualification() {
1212      return this.qualification != null && !this.qualification.isEmpty();
1213    }
1214
1215    /**
1216     * @param value {@link #qualification} (The qualification of the practitioner
1217     *              which is applicable for this service.)
1218     */
1219    public CareTeamComponent setQualification(CodeableConcept value) {
1220      this.qualification = value;
1221      return this;
1222    }
1223
1224    protected void listChildren(List<Property> children) {
1225      super.listChildren(children);
1226      children.add(
1227          new Property("sequence", "positiveInt", "A number to uniquely identify care team entries.", 0, 1, sequence));
1228      children.add(new Property("provider", "Reference(Practitioner|PractitionerRole|Organization)",
1229          "Member of the team who provided the product or service.", 0, 1, provider));
1230      children.add(new Property("responsible", "boolean",
1231          "The party who is billing and/or responsible for the claimed products or services.", 0, 1, responsible));
1232      children.add(new Property("role", "CodeableConcept",
1233          "The lead, assisting or supervising practitioner and their discipline if a multidisciplinary team.", 0, 1,
1234          role));
1235      children.add(new Property("qualification", "CodeableConcept",
1236          "The qualification of the practitioner which is applicable for this service.", 0, 1, qualification));
1237    }
1238
1239    @Override
1240    public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
1241      switch (_hash) {
1242      case 1349547969:
1243        /* sequence */ return new Property("sequence", "positiveInt",
1244            "A number to uniquely identify care team entries.", 0, 1, sequence);
1245      case -987494927:
1246        /* provider */ return new Property("provider", "Reference(Practitioner|PractitionerRole|Organization)",
1247            "Member of the team who provided the product or service.", 0, 1, provider);
1248      case 1847674614:
1249        /* responsible */ return new Property("responsible", "boolean",
1250            "The party who is billing and/or responsible for the claimed products or services.", 0, 1, responsible);
1251      case 3506294:
1252        /* role */ return new Property("role", "CodeableConcept",
1253            "The lead, assisting or supervising practitioner and their discipline if a multidisciplinary team.", 0, 1,
1254            role);
1255      case -631333393:
1256        /* qualification */ return new Property("qualification", "CodeableConcept",
1257            "The qualification of the practitioner which is applicable for this service.", 0, 1, qualification);
1258      default:
1259        return super.getNamedProperty(_hash, _name, _checkValid);
1260      }
1261
1262    }
1263
1264    @Override
1265    public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
1266      switch (hash) {
1267      case 1349547969:
1268        /* sequence */ return this.sequence == null ? new Base[0] : new Base[] { this.sequence }; // PositiveIntType
1269      case -987494927:
1270        /* provider */ return this.provider == null ? new Base[0] : new Base[] { this.provider }; // Reference
1271      case 1847674614:
1272        /* responsible */ return this.responsible == null ? new Base[0] : new Base[] { this.responsible }; // BooleanType
1273      case 3506294:
1274        /* role */ return this.role == null ? new Base[0] : new Base[] { this.role }; // CodeableConcept
1275      case -631333393:
1276        /* qualification */ return this.qualification == null ? new Base[0] : new Base[] { this.qualification }; // CodeableConcept
1277      default:
1278        return super.getProperty(hash, name, checkValid);
1279      }
1280
1281    }
1282
1283    @Override
1284    public Base setProperty(int hash, String name, Base value) throws FHIRException {
1285      switch (hash) {
1286      case 1349547969: // sequence
1287        this.sequence = castToPositiveInt(value); // PositiveIntType
1288        return value;
1289      case -987494927: // provider
1290        this.provider = castToReference(value); // Reference
1291        return value;
1292      case 1847674614: // responsible
1293        this.responsible = castToBoolean(value); // BooleanType
1294        return value;
1295      case 3506294: // role
1296        this.role = castToCodeableConcept(value); // CodeableConcept
1297        return value;
1298      case -631333393: // qualification
1299        this.qualification = castToCodeableConcept(value); // CodeableConcept
1300        return value;
1301      default:
1302        return super.setProperty(hash, name, value);
1303      }
1304
1305    }
1306
1307    @Override
1308    public Base setProperty(String name, Base value) throws FHIRException {
1309      if (name.equals("sequence")) {
1310        this.sequence = castToPositiveInt(value); // PositiveIntType
1311      } else if (name.equals("provider")) {
1312        this.provider = castToReference(value); // Reference
1313      } else if (name.equals("responsible")) {
1314        this.responsible = castToBoolean(value); // BooleanType
1315      } else if (name.equals("role")) {
1316        this.role = castToCodeableConcept(value); // CodeableConcept
1317      } else if (name.equals("qualification")) {
1318        this.qualification = castToCodeableConcept(value); // CodeableConcept
1319      } else
1320        return super.setProperty(name, value);
1321      return value;
1322    }
1323
1324  @Override
1325  public void removeChild(String name, Base value) throws FHIRException {
1326      if (name.equals("sequence")) {
1327        this.sequence = null;
1328      } else if (name.equals("provider")) {
1329        this.provider = null;
1330      } else if (name.equals("responsible")) {
1331        this.responsible = null;
1332      } else if (name.equals("role")) {
1333        this.role = null;
1334      } else if (name.equals("qualification")) {
1335        this.qualification = null;
1336      } else
1337        super.removeChild(name, value);
1338      
1339    }
1340
1341    @Override
1342    public Base makeProperty(int hash, String name) throws FHIRException {
1343      switch (hash) {
1344      case 1349547969:
1345        return getSequenceElement();
1346      case -987494927:
1347        return getProvider();
1348      case 1847674614:
1349        return getResponsibleElement();
1350      case 3506294:
1351        return getRole();
1352      case -631333393:
1353        return getQualification();
1354      default:
1355        return super.makeProperty(hash, name);
1356      }
1357
1358    }
1359
1360    @Override
1361    public String[] getTypesForProperty(int hash, String name) throws FHIRException {
1362      switch (hash) {
1363      case 1349547969:
1364        /* sequence */ return new String[] { "positiveInt" };
1365      case -987494927:
1366        /* provider */ return new String[] { "Reference" };
1367      case 1847674614:
1368        /* responsible */ return new String[] { "boolean" };
1369      case 3506294:
1370        /* role */ return new String[] { "CodeableConcept" };
1371      case -631333393:
1372        /* qualification */ return new String[] { "CodeableConcept" };
1373      default:
1374        return super.getTypesForProperty(hash, name);
1375      }
1376
1377    }
1378
1379    @Override
1380    public Base addChild(String name) throws FHIRException {
1381      if (name.equals("sequence")) {
1382        throw new FHIRException("Cannot call addChild on a singleton property Claim.sequence");
1383      } else if (name.equals("provider")) {
1384        this.provider = new Reference();
1385        return this.provider;
1386      } else if (name.equals("responsible")) {
1387        throw new FHIRException("Cannot call addChild on a singleton property Claim.responsible");
1388      } else if (name.equals("role")) {
1389        this.role = new CodeableConcept();
1390        return this.role;
1391      } else if (name.equals("qualification")) {
1392        this.qualification = new CodeableConcept();
1393        return this.qualification;
1394      } else
1395        return super.addChild(name);
1396    }
1397
1398    public CareTeamComponent copy() {
1399      CareTeamComponent dst = new CareTeamComponent();
1400      copyValues(dst);
1401      return dst;
1402    }
1403
1404    public void copyValues(CareTeamComponent dst) {
1405      super.copyValues(dst);
1406      dst.sequence = sequence == null ? null : sequence.copy();
1407      dst.provider = provider == null ? null : provider.copy();
1408      dst.responsible = responsible == null ? null : responsible.copy();
1409      dst.role = role == null ? null : role.copy();
1410      dst.qualification = qualification == null ? null : qualification.copy();
1411    }
1412
1413    @Override
1414    public boolean equalsDeep(Base other_) {
1415      if (!super.equalsDeep(other_))
1416        return false;
1417      if (!(other_ instanceof CareTeamComponent))
1418        return false;
1419      CareTeamComponent o = (CareTeamComponent) other_;
1420      return compareDeep(sequence, o.sequence, true) && compareDeep(provider, o.provider, true)
1421          && compareDeep(responsible, o.responsible, true) && compareDeep(role, o.role, true)
1422          && compareDeep(qualification, o.qualification, true);
1423    }
1424
1425    @Override
1426    public boolean equalsShallow(Base other_) {
1427      if (!super.equalsShallow(other_))
1428        return false;
1429      if (!(other_ instanceof CareTeamComponent))
1430        return false;
1431      CareTeamComponent o = (CareTeamComponent) other_;
1432      return compareValues(sequence, o.sequence, true) && compareValues(responsible, o.responsible, true);
1433    }
1434
1435    public boolean isEmpty() {
1436      return super.isEmpty()
1437          && ca.uhn.fhir.util.ElementUtil.isEmpty(sequence, provider, responsible, role, qualification);
1438    }
1439
1440    public String fhirType() {
1441      return "Claim.careTeam";
1442
1443    }
1444
1445  }
1446
1447  @Block()
1448  public static class SupportingInformationComponent extends BackboneElement implements IBaseBackboneElement {
1449    /**
1450     * A number to uniquely identify supporting information entries.
1451     */
1452    @Child(name = "sequence", type = {
1453        PositiveIntType.class }, order = 1, min = 1, max = 1, modifier = false, summary = false)
1454    @Description(shortDefinition = "Information instance identifier", formalDefinition = "A number to uniquely identify supporting information entries.")
1455    protected PositiveIntType sequence;
1456
1457    /**
1458     * The general class of the information supplied: information; exception;
1459     * accident, employment; onset, etc.
1460     */
1461    @Child(name = "category", type = {
1462        CodeableConcept.class }, order = 2, min = 1, max = 1, modifier = false, summary = false)
1463    @Description(shortDefinition = "Classification of the supplied information", formalDefinition = "The general class of the information supplied: information; exception; accident, employment; onset, etc.")
1464    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/claim-informationcategory")
1465    protected CodeableConcept category;
1466
1467    /**
1468     * System and code pertaining to the specific information regarding special
1469     * conditions relating to the setting, treatment or patient for which care is
1470     * sought.
1471     */
1472    @Child(name = "code", type = {
1473        CodeableConcept.class }, order = 3, min = 0, max = 1, modifier = false, summary = false)
1474    @Description(shortDefinition = "Type of information", formalDefinition = "System and code pertaining to the specific information regarding special conditions relating to the setting, treatment or patient  for which care is sought.")
1475    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/claim-exception")
1476    protected CodeableConcept code;
1477
1478    /**
1479     * The date when or period to which this information refers.
1480     */
1481    @Child(name = "timing", type = { DateType.class,
1482        Period.class }, order = 4, min = 0, max = 1, modifier = false, summary = false)
1483    @Description(shortDefinition = "When it occurred", formalDefinition = "The date when or period to which this information refers.")
1484    protected Type timing;
1485
1486    /**
1487     * Additional data or information such as resources, documents, images etc.
1488     * including references to the data or the actual inclusion of the data.
1489     */
1490    @Child(name = "value", type = { BooleanType.class, StringType.class, Quantity.class, Attachment.class,
1491        Reference.class }, order = 5, min = 0, max = 1, modifier = false, summary = false)
1492    @Description(shortDefinition = "Data to be provided", formalDefinition = "Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data.")
1493    protected Type value;
1494
1495    /**
1496     * Provides the reason in the situation where a reason code is required in
1497     * addition to the content.
1498     */
1499    @Child(name = "reason", type = {
1500        CodeableConcept.class }, order = 6, min = 0, max = 1, modifier = false, summary = false)
1501    @Description(shortDefinition = "Explanation for the information", formalDefinition = "Provides the reason in the situation where a reason code is required in addition to the content.")
1502    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/missing-tooth-reason")
1503    protected CodeableConcept reason;
1504
1505    private static final long serialVersionUID = -518630232L;
1506
1507    /**
1508     * Constructor
1509     */
1510    public SupportingInformationComponent() {
1511      super();
1512    }
1513
1514    /**
1515     * Constructor
1516     */
1517    public SupportingInformationComponent(PositiveIntType sequence, CodeableConcept category) {
1518      super();
1519      this.sequence = sequence;
1520      this.category = category;
1521    }
1522
1523    /**
1524     * @return {@link #sequence} (A number to uniquely identify supporting
1525     *         information entries.). This is the underlying object with id, value
1526     *         and extensions. The accessor "getSequence" gives direct access to the
1527     *         value
1528     */
1529    public PositiveIntType getSequenceElement() {
1530      if (this.sequence == null)
1531        if (Configuration.errorOnAutoCreate())
1532          throw new Error("Attempt to auto-create SupportingInformationComponent.sequence");
1533        else if (Configuration.doAutoCreate())
1534          this.sequence = new PositiveIntType(); // bb
1535      return this.sequence;
1536    }
1537
1538    public boolean hasSequenceElement() {
1539      return this.sequence != null && !this.sequence.isEmpty();
1540    }
1541
1542    public boolean hasSequence() {
1543      return this.sequence != null && !this.sequence.isEmpty();
1544    }
1545
1546    /**
1547     * @param value {@link #sequence} (A number to uniquely identify supporting
1548     *              information entries.). This is the underlying object with id,
1549     *              value and extensions. The accessor "getSequence" gives direct
1550     *              access to the value
1551     */
1552    public SupportingInformationComponent setSequenceElement(PositiveIntType value) {
1553      this.sequence = value;
1554      return this;
1555    }
1556
1557    /**
1558     * @return A number to uniquely identify supporting information entries.
1559     */
1560    public int getSequence() {
1561      return this.sequence == null || this.sequence.isEmpty() ? 0 : this.sequence.getValue();
1562    }
1563
1564    /**
1565     * @param value A number to uniquely identify supporting information entries.
1566     */
1567    public SupportingInformationComponent setSequence(int value) {
1568      if (this.sequence == null)
1569        this.sequence = new PositiveIntType();
1570      this.sequence.setValue(value);
1571      return this;
1572    }
1573
1574    /**
1575     * @return {@link #category} (The general class of the information supplied:
1576     *         information; exception; accident, employment; onset, etc.)
1577     */
1578    public CodeableConcept getCategory() {
1579      if (this.category == null)
1580        if (Configuration.errorOnAutoCreate())
1581          throw new Error("Attempt to auto-create SupportingInformationComponent.category");
1582        else if (Configuration.doAutoCreate())
1583          this.category = new CodeableConcept(); // cc
1584      return this.category;
1585    }
1586
1587    public boolean hasCategory() {
1588      return this.category != null && !this.category.isEmpty();
1589    }
1590
1591    /**
1592     * @param value {@link #category} (The general class of the information
1593     *              supplied: information; exception; accident, employment; onset,
1594     *              etc.)
1595     */
1596    public SupportingInformationComponent setCategory(CodeableConcept value) {
1597      this.category = value;
1598      return this;
1599    }
1600
1601    /**
1602     * @return {@link #code} (System and code pertaining to the specific information
1603     *         regarding special conditions relating to the setting, treatment or
1604     *         patient for which care is sought.)
1605     */
1606    public CodeableConcept getCode() {
1607      if (this.code == null)
1608        if (Configuration.errorOnAutoCreate())
1609          throw new Error("Attempt to auto-create SupportingInformationComponent.code");
1610        else if (Configuration.doAutoCreate())
1611          this.code = new CodeableConcept(); // cc
1612      return this.code;
1613    }
1614
1615    public boolean hasCode() {
1616      return this.code != null && !this.code.isEmpty();
1617    }
1618
1619    /**
1620     * @param value {@link #code} (System and code pertaining to the specific
1621     *              information regarding special conditions relating to the
1622     *              setting, treatment or patient for which care is sought.)
1623     */
1624    public SupportingInformationComponent setCode(CodeableConcept value) {
1625      this.code = value;
1626      return this;
1627    }
1628
1629    /**
1630     * @return {@link #timing} (The date when or period to which this information
1631     *         refers.)
1632     */
1633    public Type getTiming() {
1634      return this.timing;
1635    }
1636
1637    /**
1638     * @return {@link #timing} (The date when or period to which this information
1639     *         refers.)
1640     */
1641    public DateType getTimingDateType() throws FHIRException {
1642      if (this.timing == null)
1643        this.timing = new DateType();
1644      if (!(this.timing instanceof DateType))
1645        throw new FHIRException("Type mismatch: the type DateType was expected, but " + this.timing.getClass().getName()
1646            + " was encountered");
1647      return (DateType) this.timing;
1648    }
1649
1650    public boolean hasTimingDateType() {
1651      return this != null && this.timing instanceof DateType;
1652    }
1653
1654    /**
1655     * @return {@link #timing} (The date when or period to which this information
1656     *         refers.)
1657     */
1658    public Period getTimingPeriod() throws FHIRException {
1659      if (this.timing == null)
1660        this.timing = new Period();
1661      if (!(this.timing instanceof Period))
1662        throw new FHIRException("Type mismatch: the type Period was expected, but " + this.timing.getClass().getName()
1663            + " was encountered");
1664      return (Period) this.timing;
1665    }
1666
1667    public boolean hasTimingPeriod() {
1668      return this != null && this.timing instanceof Period;
1669    }
1670
1671    public boolean hasTiming() {
1672      return this.timing != null && !this.timing.isEmpty();
1673    }
1674
1675    /**
1676     * @param value {@link #timing} (The date when or period to which this
1677     *              information refers.)
1678     */
1679    public SupportingInformationComponent setTiming(Type value) {
1680      if (value != null && !(value instanceof DateType || value instanceof Period))
1681        throw new Error("Not the right type for Claim.supportingInfo.timing[x]: " + value.fhirType());
1682      this.timing = value;
1683      return this;
1684    }
1685
1686    /**
1687     * @return {@link #value} (Additional data or information such as resources,
1688     *         documents, images etc. including references to the data or the actual
1689     *         inclusion of the data.)
1690     */
1691    public Type getValue() {
1692      return this.value;
1693    }
1694
1695    /**
1696     * @return {@link #value} (Additional data or information such as resources,
1697     *         documents, images etc. including references to the data or the actual
1698     *         inclusion of the data.)
1699     */
1700    public BooleanType getValueBooleanType() throws FHIRException {
1701      if (this.value == null)
1702        this.value = new BooleanType();
1703      if (!(this.value instanceof BooleanType))
1704        throw new FHIRException("Type mismatch: the type BooleanType was expected, but "
1705            + this.value.getClass().getName() + " was encountered");
1706      return (BooleanType) this.value;
1707    }
1708
1709    public boolean hasValueBooleanType() {
1710      return this != null && this.value instanceof BooleanType;
1711    }
1712
1713    /**
1714     * @return {@link #value} (Additional data or information such as resources,
1715     *         documents, images etc. including references to the data or the actual
1716     *         inclusion of the data.)
1717     */
1718    public StringType getValueStringType() throws FHIRException {
1719      if (this.value == null)
1720        this.value = new StringType();
1721      if (!(this.value instanceof StringType))
1722        throw new FHIRException("Type mismatch: the type StringType was expected, but "
1723            + this.value.getClass().getName() + " was encountered");
1724      return (StringType) this.value;
1725    }
1726
1727    public boolean hasValueStringType() {
1728      return this != null && this.value instanceof StringType;
1729    }
1730
1731    /**
1732     * @return {@link #value} (Additional data or information such as resources,
1733     *         documents, images etc. including references to the data or the actual
1734     *         inclusion of the data.)
1735     */
1736    public Quantity getValueQuantity() throws FHIRException {
1737      if (this.value == null)
1738        this.value = new Quantity();
1739      if (!(this.value instanceof Quantity))
1740        throw new FHIRException("Type mismatch: the type Quantity was expected, but " + this.value.getClass().getName()
1741            + " was encountered");
1742      return (Quantity) this.value;
1743    }
1744
1745    public boolean hasValueQuantity() {
1746      return this != null && this.value instanceof Quantity;
1747    }
1748
1749    /**
1750     * @return {@link #value} (Additional data or information such as resources,
1751     *         documents, images etc. including references to the data or the actual
1752     *         inclusion of the data.)
1753     */
1754    public Attachment getValueAttachment() throws FHIRException {
1755      if (this.value == null)
1756        this.value = new Attachment();
1757      if (!(this.value instanceof Attachment))
1758        throw new FHIRException("Type mismatch: the type Attachment was expected, but "
1759            + this.value.getClass().getName() + " was encountered");
1760      return (Attachment) this.value;
1761    }
1762
1763    public boolean hasValueAttachment() {
1764      return this != null && this.value instanceof Attachment;
1765    }
1766
1767    /**
1768     * @return {@link #value} (Additional data or information such as resources,
1769     *         documents, images etc. including references to the data or the actual
1770     *         inclusion of the data.)
1771     */
1772    public Reference getValueReference() throws FHIRException {
1773      if (this.value == null)
1774        this.value = new Reference();
1775      if (!(this.value instanceof Reference))
1776        throw new FHIRException("Type mismatch: the type Reference was expected, but " + this.value.getClass().getName()
1777            + " was encountered");
1778      return (Reference) this.value;
1779    }
1780
1781    public boolean hasValueReference() {
1782      return this != null && this.value instanceof Reference;
1783    }
1784
1785    public boolean hasValue() {
1786      return this.value != null && !this.value.isEmpty();
1787    }
1788
1789    /**
1790     * @param value {@link #value} (Additional data or information such as
1791     *              resources, documents, images etc. including references to the
1792     *              data or the actual inclusion of the data.)
1793     */
1794    public SupportingInformationComponent setValue(Type value) {
1795      if (value != null && !(value instanceof BooleanType || value instanceof StringType || value instanceof Quantity
1796          || value instanceof Attachment || value instanceof Reference))
1797        throw new Error("Not the right type for Claim.supportingInfo.value[x]: " + value.fhirType());
1798      this.value = value;
1799      return this;
1800    }
1801
1802    /**
1803     * @return {@link #reason} (Provides the reason in the situation where a reason
1804     *         code is required in addition to the content.)
1805     */
1806    public CodeableConcept getReason() {
1807      if (this.reason == null)
1808        if (Configuration.errorOnAutoCreate())
1809          throw new Error("Attempt to auto-create SupportingInformationComponent.reason");
1810        else if (Configuration.doAutoCreate())
1811          this.reason = new CodeableConcept(); // cc
1812      return this.reason;
1813    }
1814
1815    public boolean hasReason() {
1816      return this.reason != null && !this.reason.isEmpty();
1817    }
1818
1819    /**
1820     * @param value {@link #reason} (Provides the reason in the situation where a
1821     *              reason code is required in addition to the content.)
1822     */
1823    public SupportingInformationComponent setReason(CodeableConcept value) {
1824      this.reason = value;
1825      return this;
1826    }
1827
1828    protected void listChildren(List<Property> children) {
1829      super.listChildren(children);
1830      children.add(new Property("sequence", "positiveInt",
1831          "A number to uniquely identify supporting information entries.", 0, 1, sequence));
1832      children.add(new Property("category", "CodeableConcept",
1833          "The general class of the information supplied: information; exception; accident, employment; onset, etc.", 0,
1834          1, category));
1835      children.add(new Property("code", "CodeableConcept",
1836          "System and code pertaining to the specific information regarding special conditions relating to the setting, treatment or patient  for which care is sought.",
1837          0, 1, code));
1838      children.add(new Property("timing[x]", "date|Period", "The date when or period to which this information refers.",
1839          0, 1, timing));
1840      children.add(new Property("value[x]", "boolean|string|Quantity|Attachment|Reference(Any)",
1841          "Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data.",
1842          0, 1, value));
1843      children.add(new Property("reason", "CodeableConcept",
1844          "Provides the reason in the situation where a reason code is required in addition to the content.", 0, 1,
1845          reason));
1846    }
1847
1848    @Override
1849    public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
1850      switch (_hash) {
1851      case 1349547969:
1852        /* sequence */ return new Property("sequence", "positiveInt",
1853            "A number to uniquely identify supporting information entries.", 0, 1, sequence);
1854      case 50511102:
1855        /* category */ return new Property("category", "CodeableConcept",
1856            "The general class of the information supplied: information; exception; accident, employment; onset, etc.",
1857            0, 1, category);
1858      case 3059181:
1859        /* code */ return new Property("code", "CodeableConcept",
1860            "System and code pertaining to the specific information regarding special conditions relating to the setting, treatment or patient  for which care is sought.",
1861            0, 1, code);
1862      case 164632566:
1863        /* timing[x] */ return new Property("timing[x]", "date|Period",
1864            "The date when or period to which this information refers.", 0, 1, timing);
1865      case -873664438:
1866        /* timing */ return new Property("timing[x]", "date|Period",
1867            "The date when or period to which this information refers.", 0, 1, timing);
1868      case 807935768:
1869        /* timingDate */ return new Property("timing[x]", "date|Period",
1870            "The date when or period to which this information refers.", 0, 1, timing);
1871      case -615615829:
1872        /* timingPeriod */ return new Property("timing[x]", "date|Period",
1873            "The date when or period to which this information refers.", 0, 1, timing);
1874      case -1410166417:
1875        /* value[x] */ return new Property("value[x]", "boolean|string|Quantity|Attachment|Reference(Any)",
1876            "Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data.",
1877            0, 1, value);
1878      case 111972721:
1879        /* value */ return new Property("value[x]", "boolean|string|Quantity|Attachment|Reference(Any)",
1880            "Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data.",
1881            0, 1, value);
1882      case 733421943:
1883        /* valueBoolean */ return new Property("value[x]", "boolean|string|Quantity|Attachment|Reference(Any)",
1884            "Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data.",
1885            0, 1, value);
1886      case -1424603934:
1887        /* valueString */ return new Property("value[x]", "boolean|string|Quantity|Attachment|Reference(Any)",
1888            "Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data.",
1889            0, 1, value);
1890      case -2029823716:
1891        /* valueQuantity */ return new Property("value[x]", "boolean|string|Quantity|Attachment|Reference(Any)",
1892            "Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data.",
1893            0, 1, value);
1894      case -475566732:
1895        /* valueAttachment */ return new Property("value[x]", "boolean|string|Quantity|Attachment|Reference(Any)",
1896            "Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data.",
1897            0, 1, value);
1898      case 1755241690:
1899        /* valueReference */ return new Property("value[x]", "boolean|string|Quantity|Attachment|Reference(Any)",
1900            "Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data.",
1901            0, 1, value);
1902      case -934964668:
1903        /* reason */ return new Property("reason", "CodeableConcept",
1904            "Provides the reason in the situation where a reason code is required in addition to the content.", 0, 1,
1905            reason);
1906      default:
1907        return super.getNamedProperty(_hash, _name, _checkValid);
1908      }
1909
1910    }
1911
1912    @Override
1913    public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
1914      switch (hash) {
1915      case 1349547969:
1916        /* sequence */ return this.sequence == null ? new Base[0] : new Base[] { this.sequence }; // PositiveIntType
1917      case 50511102:
1918        /* category */ return this.category == null ? new Base[0] : new Base[] { this.category }; // CodeableConcept
1919      case 3059181:
1920        /* code */ return this.code == null ? new Base[0] : new Base[] { this.code }; // CodeableConcept
1921      case -873664438:
1922        /* timing */ return this.timing == null ? new Base[0] : new Base[] { this.timing }; // Type
1923      case 111972721:
1924        /* value */ return this.value == null ? new Base[0] : new Base[] { this.value }; // Type
1925      case -934964668:
1926        /* reason */ return this.reason == null ? new Base[0] : new Base[] { this.reason }; // CodeableConcept
1927      default:
1928        return super.getProperty(hash, name, checkValid);
1929      }
1930
1931    }
1932
1933    @Override
1934    public Base setProperty(int hash, String name, Base value) throws FHIRException {
1935      switch (hash) {
1936      case 1349547969: // sequence
1937        this.sequence = castToPositiveInt(value); // PositiveIntType
1938        return value;
1939      case 50511102: // category
1940        this.category = castToCodeableConcept(value); // CodeableConcept
1941        return value;
1942      case 3059181: // code
1943        this.code = castToCodeableConcept(value); // CodeableConcept
1944        return value;
1945      case -873664438: // timing
1946        this.timing = castToType(value); // Type
1947        return value;
1948      case 111972721: // value
1949        this.value = castToType(value); // Type
1950        return value;
1951      case -934964668: // reason
1952        this.reason = castToCodeableConcept(value); // CodeableConcept
1953        return value;
1954      default:
1955        return super.setProperty(hash, name, value);
1956      }
1957
1958    }
1959
1960    @Override
1961    public Base setProperty(String name, Base value) throws FHIRException {
1962      if (name.equals("sequence")) {
1963        this.sequence = castToPositiveInt(value); // PositiveIntType
1964      } else if (name.equals("category")) {
1965        this.category = castToCodeableConcept(value); // CodeableConcept
1966      } else if (name.equals("code")) {
1967        this.code = castToCodeableConcept(value); // CodeableConcept
1968      } else if (name.equals("timing[x]")) {
1969        this.timing = castToType(value); // Type
1970      } else if (name.equals("value[x]")) {
1971        this.value = castToType(value); // Type
1972      } else if (name.equals("reason")) {
1973        this.reason = castToCodeableConcept(value); // CodeableConcept
1974      } else
1975        return super.setProperty(name, value);
1976      return value;
1977    }
1978
1979  @Override
1980  public void removeChild(String name, Base value) throws FHIRException {
1981      if (name.equals("sequence")) {
1982        this.sequence = null;
1983      } else if (name.equals("category")) {
1984        this.category = null;
1985      } else if (name.equals("code")) {
1986        this.code = null;
1987      } else if (name.equals("timing[x]")) {
1988        this.timing = null;
1989      } else if (name.equals("value[x]")) {
1990        this.value = null;
1991      } else if (name.equals("reason")) {
1992        this.reason = null;
1993      } else
1994        super.removeChild(name, value);
1995      
1996    }
1997
1998    @Override
1999    public Base makeProperty(int hash, String name) throws FHIRException {
2000      switch (hash) {
2001      case 1349547969:
2002        return getSequenceElement();
2003      case 50511102:
2004        return getCategory();
2005      case 3059181:
2006        return getCode();
2007      case 164632566:
2008        return getTiming();
2009      case -873664438:
2010        return getTiming();
2011      case -1410166417:
2012        return getValue();
2013      case 111972721:
2014        return getValue();
2015      case -934964668:
2016        return getReason();
2017      default:
2018        return super.makeProperty(hash, name);
2019      }
2020
2021    }
2022
2023    @Override
2024    public String[] getTypesForProperty(int hash, String name) throws FHIRException {
2025      switch (hash) {
2026      case 1349547969:
2027        /* sequence */ return new String[] { "positiveInt" };
2028      case 50511102:
2029        /* category */ return new String[] { "CodeableConcept" };
2030      case 3059181:
2031        /* code */ return new String[] { "CodeableConcept" };
2032      case -873664438:
2033        /* timing */ return new String[] { "date", "Period" };
2034      case 111972721:
2035        /* value */ return new String[] { "boolean", "string", "Quantity", "Attachment", "Reference" };
2036      case -934964668:
2037        /* reason */ return new String[] { "CodeableConcept" };
2038      default:
2039        return super.getTypesForProperty(hash, name);
2040      }
2041
2042    }
2043
2044    @Override
2045    public Base addChild(String name) throws FHIRException {
2046      if (name.equals("sequence")) {
2047        throw new FHIRException("Cannot call addChild on a singleton property Claim.sequence");
2048      } else if (name.equals("category")) {
2049        this.category = new CodeableConcept();
2050        return this.category;
2051      } else if (name.equals("code")) {
2052        this.code = new CodeableConcept();
2053        return this.code;
2054      } else if (name.equals("timingDate")) {
2055        this.timing = new DateType();
2056        return this.timing;
2057      } else if (name.equals("timingPeriod")) {
2058        this.timing = new Period();
2059        return this.timing;
2060      } else if (name.equals("valueBoolean")) {
2061        this.value = new BooleanType();
2062        return this.value;
2063      } else if (name.equals("valueString")) {
2064        this.value = new StringType();
2065        return this.value;
2066      } else if (name.equals("valueQuantity")) {
2067        this.value = new Quantity();
2068        return this.value;
2069      } else if (name.equals("valueAttachment")) {
2070        this.value = new Attachment();
2071        return this.value;
2072      } else if (name.equals("valueReference")) {
2073        this.value = new Reference();
2074        return this.value;
2075      } else if (name.equals("reason")) {
2076        this.reason = new CodeableConcept();
2077        return this.reason;
2078      } else
2079        return super.addChild(name);
2080    }
2081
2082    public SupportingInformationComponent copy() {
2083      SupportingInformationComponent dst = new SupportingInformationComponent();
2084      copyValues(dst);
2085      return dst;
2086    }
2087
2088    public void copyValues(SupportingInformationComponent dst) {
2089      super.copyValues(dst);
2090      dst.sequence = sequence == null ? null : sequence.copy();
2091      dst.category = category == null ? null : category.copy();
2092      dst.code = code == null ? null : code.copy();
2093      dst.timing = timing == null ? null : timing.copy();
2094      dst.value = value == null ? null : value.copy();
2095      dst.reason = reason == null ? null : reason.copy();
2096    }
2097
2098    @Override
2099    public boolean equalsDeep(Base other_) {
2100      if (!super.equalsDeep(other_))
2101        return false;
2102      if (!(other_ instanceof SupportingInformationComponent))
2103        return false;
2104      SupportingInformationComponent o = (SupportingInformationComponent) other_;
2105      return compareDeep(sequence, o.sequence, true) && compareDeep(category, o.category, true)
2106          && compareDeep(code, o.code, true) && compareDeep(timing, o.timing, true) && compareDeep(value, o.value, true)
2107          && compareDeep(reason, o.reason, true);
2108    }
2109
2110    @Override
2111    public boolean equalsShallow(Base other_) {
2112      if (!super.equalsShallow(other_))
2113        return false;
2114      if (!(other_ instanceof SupportingInformationComponent))
2115        return false;
2116      SupportingInformationComponent o = (SupportingInformationComponent) other_;
2117      return compareValues(sequence, o.sequence, true);
2118    }
2119
2120    public boolean isEmpty() {
2121      return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(sequence, category, code, timing, value, reason);
2122    }
2123
2124    public String fhirType() {
2125      return "Claim.supportingInfo";
2126
2127    }
2128
2129  }
2130
2131  @Block()
2132  public static class DiagnosisComponent extends BackboneElement implements IBaseBackboneElement {
2133    /**
2134     * A number to uniquely identify diagnosis entries.
2135     */
2136    @Child(name = "sequence", type = {
2137        PositiveIntType.class }, order = 1, min = 1, max = 1, modifier = false, summary = false)
2138    @Description(shortDefinition = "Diagnosis instance identifier", formalDefinition = "A number to uniquely identify diagnosis entries.")
2139    protected PositiveIntType sequence;
2140
2141    /**
2142     * The nature of illness or problem in a coded form or as a reference to an
2143     * external defined Condition.
2144     */
2145    @Child(name = "diagnosis", type = { CodeableConcept.class,
2146        Condition.class }, order = 2, min = 1, max = 1, modifier = false, summary = false)
2147    @Description(shortDefinition = "Nature of illness or problem", formalDefinition = "The nature of illness or problem in a coded form or as a reference to an external defined Condition.")
2148    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/icd-10")
2149    protected Type diagnosis;
2150
2151    /**
2152     * When the condition was observed or the relative ranking.
2153     */
2154    @Child(name = "type", type = {
2155        CodeableConcept.class }, order = 3, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
2156    @Description(shortDefinition = "Timing or nature of the diagnosis", formalDefinition = "When the condition was observed or the relative ranking.")
2157    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/ex-diagnosistype")
2158    protected List<CodeableConcept> type;
2159
2160    /**
2161     * Indication of whether the diagnosis was present on admission to a facility.
2162     */
2163    @Child(name = "onAdmission", type = {
2164        CodeableConcept.class }, order = 4, min = 0, max = 1, modifier = false, summary = false)
2165    @Description(shortDefinition = "Present on admission", formalDefinition = "Indication of whether the diagnosis was present on admission to a facility.")
2166    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/ex-diagnosis-on-admission")
2167    protected CodeableConcept onAdmission;
2168
2169    /**
2170     * A package billing code or bundle code used to group products and services to
2171     * a particular health condition (such as heart attack) which is based on a
2172     * predetermined grouping code system.
2173     */
2174    @Child(name = "packageCode", type = {
2175        CodeableConcept.class }, order = 5, min = 0, max = 1, modifier = false, summary = false)
2176    @Description(shortDefinition = "Package billing code", formalDefinition = "A package billing code or bundle code used to group products and services to a particular health condition (such as heart attack) which is based on a predetermined grouping code system.")
2177    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/ex-diagnosisrelatedgroup")
2178    protected CodeableConcept packageCode;
2179
2180    private static final long serialVersionUID = 2120593974L;
2181
2182    /**
2183     * Constructor
2184     */
2185    public DiagnosisComponent() {
2186      super();
2187    }
2188
2189    /**
2190     * Constructor
2191     */
2192    public DiagnosisComponent(PositiveIntType sequence, Type diagnosis) {
2193      super();
2194      this.sequence = sequence;
2195      this.diagnosis = diagnosis;
2196    }
2197
2198    /**
2199     * @return {@link #sequence} (A number to uniquely identify diagnosis entries.).
2200     *         This is the underlying object with id, value and extensions. The
2201     *         accessor "getSequence" gives direct access to the value
2202     */
2203    public PositiveIntType getSequenceElement() {
2204      if (this.sequence == null)
2205        if (Configuration.errorOnAutoCreate())
2206          throw new Error("Attempt to auto-create DiagnosisComponent.sequence");
2207        else if (Configuration.doAutoCreate())
2208          this.sequence = new PositiveIntType(); // bb
2209      return this.sequence;
2210    }
2211
2212    public boolean hasSequenceElement() {
2213      return this.sequence != null && !this.sequence.isEmpty();
2214    }
2215
2216    public boolean hasSequence() {
2217      return this.sequence != null && !this.sequence.isEmpty();
2218    }
2219
2220    /**
2221     * @param value {@link #sequence} (A number to uniquely identify diagnosis
2222     *              entries.). This is the underlying object with id, value and
2223     *              extensions. The accessor "getSequence" gives direct access to
2224     *              the value
2225     */
2226    public DiagnosisComponent setSequenceElement(PositiveIntType value) {
2227      this.sequence = value;
2228      return this;
2229    }
2230
2231    /**
2232     * @return A number to uniquely identify diagnosis entries.
2233     */
2234    public int getSequence() {
2235      return this.sequence == null || this.sequence.isEmpty() ? 0 : this.sequence.getValue();
2236    }
2237
2238    /**
2239     * @param value A number to uniquely identify diagnosis entries.
2240     */
2241    public DiagnosisComponent setSequence(int value) {
2242      if (this.sequence == null)
2243        this.sequence = new PositiveIntType();
2244      this.sequence.setValue(value);
2245      return this;
2246    }
2247
2248    /**
2249     * @return {@link #diagnosis} (The nature of illness or problem in a coded form
2250     *         or as a reference to an external defined Condition.)
2251     */
2252    public Type getDiagnosis() {
2253      return this.diagnosis;
2254    }
2255
2256    /**
2257     * @return {@link #diagnosis} (The nature of illness or problem in a coded form
2258     *         or as a reference to an external defined Condition.)
2259     */
2260    public CodeableConcept getDiagnosisCodeableConcept() throws FHIRException {
2261      if (this.diagnosis == null)
2262        this.diagnosis = new CodeableConcept();
2263      if (!(this.diagnosis instanceof CodeableConcept))
2264        throw new FHIRException("Type mismatch: the type CodeableConcept was expected, but "
2265            + this.diagnosis.getClass().getName() + " was encountered");
2266      return (CodeableConcept) this.diagnosis;
2267    }
2268
2269    public boolean hasDiagnosisCodeableConcept() {
2270      return this != null && this.diagnosis instanceof CodeableConcept;
2271    }
2272
2273    /**
2274     * @return {@link #diagnosis} (The nature of illness or problem in a coded form
2275     *         or as a reference to an external defined Condition.)
2276     */
2277    public Reference getDiagnosisReference() throws FHIRException {
2278      if (this.diagnosis == null)
2279        this.diagnosis = new Reference();
2280      if (!(this.diagnosis instanceof Reference))
2281        throw new FHIRException("Type mismatch: the type Reference was expected, but "
2282            + this.diagnosis.getClass().getName() + " was encountered");
2283      return (Reference) this.diagnosis;
2284    }
2285
2286    public boolean hasDiagnosisReference() {
2287      return this != null && this.diagnosis instanceof Reference;
2288    }
2289
2290    public boolean hasDiagnosis() {
2291      return this.diagnosis != null && !this.diagnosis.isEmpty();
2292    }
2293
2294    /**
2295     * @param value {@link #diagnosis} (The nature of illness or problem in a coded
2296     *              form or as a reference to an external defined Condition.)
2297     */
2298    public DiagnosisComponent setDiagnosis(Type value) {
2299      if (value != null && !(value instanceof CodeableConcept || value instanceof Reference))
2300        throw new Error("Not the right type for Claim.diagnosis.diagnosis[x]: " + value.fhirType());
2301      this.diagnosis = value;
2302      return this;
2303    }
2304
2305    /**
2306     * @return {@link #type} (When the condition was observed or the relative
2307     *         ranking.)
2308     */
2309    public List<CodeableConcept> getType() {
2310      if (this.type == null)
2311        this.type = new ArrayList<CodeableConcept>();
2312      return this.type;
2313    }
2314
2315    /**
2316     * @return Returns a reference to <code>this</code> for easy method chaining
2317     */
2318    public DiagnosisComponent setType(List<CodeableConcept> theType) {
2319      this.type = theType;
2320      return this;
2321    }
2322
2323    public boolean hasType() {
2324      if (this.type == null)
2325        return false;
2326      for (CodeableConcept item : this.type)
2327        if (!item.isEmpty())
2328          return true;
2329      return false;
2330    }
2331
2332    public CodeableConcept addType() { // 3
2333      CodeableConcept t = new CodeableConcept();
2334      if (this.type == null)
2335        this.type = new ArrayList<CodeableConcept>();
2336      this.type.add(t);
2337      return t;
2338    }
2339
2340    public DiagnosisComponent addType(CodeableConcept t) { // 3
2341      if (t == null)
2342        return this;
2343      if (this.type == null)
2344        this.type = new ArrayList<CodeableConcept>();
2345      this.type.add(t);
2346      return this;
2347    }
2348
2349    /**
2350     * @return The first repetition of repeating field {@link #type}, creating it if
2351     *         it does not already exist
2352     */
2353    public CodeableConcept getTypeFirstRep() {
2354      if (getType().isEmpty()) {
2355        addType();
2356      }
2357      return getType().get(0);
2358    }
2359
2360    /**
2361     * @return {@link #onAdmission} (Indication of whether the diagnosis was present
2362     *         on admission to a facility.)
2363     */
2364    public CodeableConcept getOnAdmission() {
2365      if (this.onAdmission == null)
2366        if (Configuration.errorOnAutoCreate())
2367          throw new Error("Attempt to auto-create DiagnosisComponent.onAdmission");
2368        else if (Configuration.doAutoCreate())
2369          this.onAdmission = new CodeableConcept(); // cc
2370      return this.onAdmission;
2371    }
2372
2373    public boolean hasOnAdmission() {
2374      return this.onAdmission != null && !this.onAdmission.isEmpty();
2375    }
2376
2377    /**
2378     * @param value {@link #onAdmission} (Indication of whether the diagnosis was
2379     *              present on admission to a facility.)
2380     */
2381    public DiagnosisComponent setOnAdmission(CodeableConcept value) {
2382      this.onAdmission = value;
2383      return this;
2384    }
2385
2386    /**
2387     * @return {@link #packageCode} (A package billing code or bundle code used to
2388     *         group products and services to a particular health condition (such as
2389     *         heart attack) which is based on a predetermined grouping code
2390     *         system.)
2391     */
2392    public CodeableConcept getPackageCode() {
2393      if (this.packageCode == null)
2394        if (Configuration.errorOnAutoCreate())
2395          throw new Error("Attempt to auto-create DiagnosisComponent.packageCode");
2396        else if (Configuration.doAutoCreate())
2397          this.packageCode = new CodeableConcept(); // cc
2398      return this.packageCode;
2399    }
2400
2401    public boolean hasPackageCode() {
2402      return this.packageCode != null && !this.packageCode.isEmpty();
2403    }
2404
2405    /**
2406     * @param value {@link #packageCode} (A package billing code or bundle code used
2407     *              to group products and services to a particular health condition
2408     *              (such as heart attack) which is based on a predetermined
2409     *              grouping code system.)
2410     */
2411    public DiagnosisComponent setPackageCode(CodeableConcept value) {
2412      this.packageCode = value;
2413      return this;
2414    }
2415
2416    protected void listChildren(List<Property> children) {
2417      super.listChildren(children);
2418      children.add(
2419          new Property("sequence", "positiveInt", "A number to uniquely identify diagnosis entries.", 0, 1, sequence));
2420      children.add(new Property("diagnosis[x]", "CodeableConcept|Reference(Condition)",
2421          "The nature of illness or problem in a coded form or as a reference to an external defined Condition.", 0, 1,
2422          diagnosis));
2423      children.add(new Property("type", "CodeableConcept", "When the condition was observed or the relative ranking.",
2424          0, java.lang.Integer.MAX_VALUE, type));
2425      children.add(new Property("onAdmission", "CodeableConcept",
2426          "Indication of whether the diagnosis was present on admission to a facility.", 0, 1, onAdmission));
2427      children.add(new Property("packageCode", "CodeableConcept",
2428          "A package billing code or bundle code used to group products and services to a particular health condition (such as heart attack) which is based on a predetermined grouping code system.",
2429          0, 1, packageCode));
2430    }
2431
2432    @Override
2433    public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
2434      switch (_hash) {
2435      case 1349547969:
2436        /* sequence */ return new Property("sequence", "positiveInt",
2437            "A number to uniquely identify diagnosis entries.", 0, 1, sequence);
2438      case -1487009809:
2439        /* diagnosis[x] */ return new Property("diagnosis[x]", "CodeableConcept|Reference(Condition)",
2440            "The nature of illness or problem in a coded form or as a reference to an external defined Condition.", 0,
2441            1, diagnosis);
2442      case 1196993265:
2443        /* diagnosis */ return new Property("diagnosis[x]", "CodeableConcept|Reference(Condition)",
2444            "The nature of illness or problem in a coded form or as a reference to an external defined Condition.", 0,
2445            1, diagnosis);
2446      case 277781616:
2447        /* diagnosisCodeableConcept */ return new Property("diagnosis[x]", "CodeableConcept|Reference(Condition)",
2448            "The nature of illness or problem in a coded form or as a reference to an external defined Condition.", 0,
2449            1, diagnosis);
2450      case 2050454362:
2451        /* diagnosisReference */ return new Property("diagnosis[x]", "CodeableConcept|Reference(Condition)",
2452            "The nature of illness or problem in a coded form or as a reference to an external defined Condition.", 0,
2453            1, diagnosis);
2454      case 3575610:
2455        /* type */ return new Property("type", "CodeableConcept",
2456            "When the condition was observed or the relative ranking.", 0, java.lang.Integer.MAX_VALUE, type);
2457      case -3386134:
2458        /* onAdmission */ return new Property("onAdmission", "CodeableConcept",
2459            "Indication of whether the diagnosis was present on admission to a facility.", 0, 1, onAdmission);
2460      case 908444499:
2461        /* packageCode */ return new Property("packageCode", "CodeableConcept",
2462            "A package billing code or bundle code used to group products and services to a particular health condition (such as heart attack) which is based on a predetermined grouping code system.",
2463            0, 1, packageCode);
2464      default:
2465        return super.getNamedProperty(_hash, _name, _checkValid);
2466      }
2467
2468    }
2469
2470    @Override
2471    public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
2472      switch (hash) {
2473      case 1349547969:
2474        /* sequence */ return this.sequence == null ? new Base[0] : new Base[] { this.sequence }; // PositiveIntType
2475      case 1196993265:
2476        /* diagnosis */ return this.diagnosis == null ? new Base[0] : new Base[] { this.diagnosis }; // Type
2477      case 3575610:
2478        /* type */ return this.type == null ? new Base[0] : this.type.toArray(new Base[this.type.size()]); // CodeableConcept
2479      case -3386134:
2480        /* onAdmission */ return this.onAdmission == null ? new Base[0] : new Base[] { this.onAdmission }; // CodeableConcept
2481      case 908444499:
2482        /* packageCode */ return this.packageCode == null ? new Base[0] : new Base[] { this.packageCode }; // CodeableConcept
2483      default:
2484        return super.getProperty(hash, name, checkValid);
2485      }
2486
2487    }
2488
2489    @Override
2490    public Base setProperty(int hash, String name, Base value) throws FHIRException {
2491      switch (hash) {
2492      case 1349547969: // sequence
2493        this.sequence = castToPositiveInt(value); // PositiveIntType
2494        return value;
2495      case 1196993265: // diagnosis
2496        this.diagnosis = castToType(value); // Type
2497        return value;
2498      case 3575610: // type
2499        this.getType().add(castToCodeableConcept(value)); // CodeableConcept
2500        return value;
2501      case -3386134: // onAdmission
2502        this.onAdmission = castToCodeableConcept(value); // CodeableConcept
2503        return value;
2504      case 908444499: // packageCode
2505        this.packageCode = castToCodeableConcept(value); // CodeableConcept
2506        return value;
2507      default:
2508        return super.setProperty(hash, name, value);
2509      }
2510
2511    }
2512
2513    @Override
2514    public Base setProperty(String name, Base value) throws FHIRException {
2515      if (name.equals("sequence")) {
2516        this.sequence = castToPositiveInt(value); // PositiveIntType
2517      } else if (name.equals("diagnosis[x]")) {
2518        this.diagnosis = castToType(value); // Type
2519      } else if (name.equals("type")) {
2520        this.getType().add(castToCodeableConcept(value));
2521      } else if (name.equals("onAdmission")) {
2522        this.onAdmission = castToCodeableConcept(value); // CodeableConcept
2523      } else if (name.equals("packageCode")) {
2524        this.packageCode = castToCodeableConcept(value); // CodeableConcept
2525      } else
2526        return super.setProperty(name, value);
2527      return value;
2528    }
2529
2530  @Override
2531  public void removeChild(String name, Base value) throws FHIRException {
2532      if (name.equals("sequence")) {
2533        this.sequence = null;
2534      } else if (name.equals("diagnosis[x]")) {
2535        this.diagnosis = null;
2536      } else if (name.equals("type")) {
2537        this.getType().remove(castToCodeableConcept(value));
2538      } else if (name.equals("onAdmission")) {
2539        this.onAdmission = null;
2540      } else if (name.equals("packageCode")) {
2541        this.packageCode = null;
2542      } else
2543        super.removeChild(name, value);
2544      
2545    }
2546
2547    @Override
2548    public Base makeProperty(int hash, String name) throws FHIRException {
2549      switch (hash) {
2550      case 1349547969:
2551        return getSequenceElement();
2552      case -1487009809:
2553        return getDiagnosis();
2554      case 1196993265:
2555        return getDiagnosis();
2556      case 3575610:
2557        return addType();
2558      case -3386134:
2559        return getOnAdmission();
2560      case 908444499:
2561        return getPackageCode();
2562      default:
2563        return super.makeProperty(hash, name);
2564      }
2565
2566    }
2567
2568    @Override
2569    public String[] getTypesForProperty(int hash, String name) throws FHIRException {
2570      switch (hash) {
2571      case 1349547969:
2572        /* sequence */ return new String[] { "positiveInt" };
2573      case 1196993265:
2574        /* diagnosis */ return new String[] { "CodeableConcept", "Reference" };
2575      case 3575610:
2576        /* type */ return new String[] { "CodeableConcept" };
2577      case -3386134:
2578        /* onAdmission */ return new String[] { "CodeableConcept" };
2579      case 908444499:
2580        /* packageCode */ return new String[] { "CodeableConcept" };
2581      default:
2582        return super.getTypesForProperty(hash, name);
2583      }
2584
2585    }
2586
2587    @Override
2588    public Base addChild(String name) throws FHIRException {
2589      if (name.equals("sequence")) {
2590        throw new FHIRException("Cannot call addChild on a singleton property Claim.sequence");
2591      } else if (name.equals("diagnosisCodeableConcept")) {
2592        this.diagnosis = new CodeableConcept();
2593        return this.diagnosis;
2594      } else if (name.equals("diagnosisReference")) {
2595        this.diagnosis = new Reference();
2596        return this.diagnosis;
2597      } else if (name.equals("type")) {
2598        return addType();
2599      } else if (name.equals("onAdmission")) {
2600        this.onAdmission = new CodeableConcept();
2601        return this.onAdmission;
2602      } else if (name.equals("packageCode")) {
2603        this.packageCode = new CodeableConcept();
2604        return this.packageCode;
2605      } else
2606        return super.addChild(name);
2607    }
2608
2609    public DiagnosisComponent copy() {
2610      DiagnosisComponent dst = new DiagnosisComponent();
2611      copyValues(dst);
2612      return dst;
2613    }
2614
2615    public void copyValues(DiagnosisComponent dst) {
2616      super.copyValues(dst);
2617      dst.sequence = sequence == null ? null : sequence.copy();
2618      dst.diagnosis = diagnosis == null ? null : diagnosis.copy();
2619      if (type != null) {
2620        dst.type = new ArrayList<CodeableConcept>();
2621        for (CodeableConcept i : type)
2622          dst.type.add(i.copy());
2623      }
2624      ;
2625      dst.onAdmission = onAdmission == null ? null : onAdmission.copy();
2626      dst.packageCode = packageCode == null ? null : packageCode.copy();
2627    }
2628
2629    @Override
2630    public boolean equalsDeep(Base other_) {
2631      if (!super.equalsDeep(other_))
2632        return false;
2633      if (!(other_ instanceof DiagnosisComponent))
2634        return false;
2635      DiagnosisComponent o = (DiagnosisComponent) other_;
2636      return compareDeep(sequence, o.sequence, true) && compareDeep(diagnosis, o.diagnosis, true)
2637          && compareDeep(type, o.type, true) && compareDeep(onAdmission, o.onAdmission, true)
2638          && compareDeep(packageCode, o.packageCode, true);
2639    }
2640
2641    @Override
2642    public boolean equalsShallow(Base other_) {
2643      if (!super.equalsShallow(other_))
2644        return false;
2645      if (!(other_ instanceof DiagnosisComponent))
2646        return false;
2647      DiagnosisComponent o = (DiagnosisComponent) other_;
2648      return compareValues(sequence, o.sequence, true);
2649    }
2650
2651    public boolean isEmpty() {
2652      return super.isEmpty()
2653          && ca.uhn.fhir.util.ElementUtil.isEmpty(sequence, diagnosis, type, onAdmission, packageCode);
2654    }
2655
2656    public String fhirType() {
2657      return "Claim.diagnosis";
2658
2659    }
2660
2661  }
2662
2663  @Block()
2664  public static class ProcedureComponent extends BackboneElement implements IBaseBackboneElement {
2665    /**
2666     * A number to uniquely identify procedure entries.
2667     */
2668    @Child(name = "sequence", type = {
2669        PositiveIntType.class }, order = 1, min = 1, max = 1, modifier = false, summary = false)
2670    @Description(shortDefinition = "Procedure instance identifier", formalDefinition = "A number to uniquely identify procedure entries.")
2671    protected PositiveIntType sequence;
2672
2673    /**
2674     * When the condition was observed or the relative ranking.
2675     */
2676    @Child(name = "type", type = {
2677        CodeableConcept.class }, order = 2, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
2678    @Description(shortDefinition = "Category of Procedure", formalDefinition = "When the condition was observed or the relative ranking.")
2679    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/ex-procedure-type")
2680    protected List<CodeableConcept> type;
2681
2682    /**
2683     * Date and optionally time the procedure was performed.
2684     */
2685    @Child(name = "date", type = { DateTimeType.class }, order = 3, min = 0, max = 1, modifier = false, summary = false)
2686    @Description(shortDefinition = "When the procedure was performed", formalDefinition = "Date and optionally time the procedure was performed.")
2687    protected DateTimeType date;
2688
2689    /**
2690     * The code or reference to a Procedure resource which identifies the clinical
2691     * intervention performed.
2692     */
2693    @Child(name = "procedure", type = { CodeableConcept.class,
2694        Procedure.class }, order = 4, min = 1, max = 1, modifier = false, summary = false)
2695    @Description(shortDefinition = "Specific clinical procedure", formalDefinition = "The code or reference to a Procedure resource which identifies the clinical intervention performed.")
2696    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/icd-10-procedures")
2697    protected Type procedure;
2698
2699    /**
2700     * Unique Device Identifiers associated with this line item.
2701     */
2702    @Child(name = "udi", type = {
2703        Device.class }, order = 5, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
2704    @Description(shortDefinition = "Unique device identifier", formalDefinition = "Unique Device Identifiers associated with this line item.")
2705    protected List<Reference> udi;
2706    /**
2707     * The actual objects that are the target of the reference (Unique Device
2708     * Identifiers associated with this line item.)
2709     */
2710    protected List<Device> udiTarget;
2711
2712    private static final long serialVersionUID = 935341852L;
2713
2714    /**
2715     * Constructor
2716     */
2717    public ProcedureComponent() {
2718      super();
2719    }
2720
2721    /**
2722     * Constructor
2723     */
2724    public ProcedureComponent(PositiveIntType sequence, Type procedure) {
2725      super();
2726      this.sequence = sequence;
2727      this.procedure = procedure;
2728    }
2729
2730    /**
2731     * @return {@link #sequence} (A number to uniquely identify procedure entries.).
2732     *         This is the underlying object with id, value and extensions. The
2733     *         accessor "getSequence" gives direct access to the value
2734     */
2735    public PositiveIntType getSequenceElement() {
2736      if (this.sequence == null)
2737        if (Configuration.errorOnAutoCreate())
2738          throw new Error("Attempt to auto-create ProcedureComponent.sequence");
2739        else if (Configuration.doAutoCreate())
2740          this.sequence = new PositiveIntType(); // bb
2741      return this.sequence;
2742    }
2743
2744    public boolean hasSequenceElement() {
2745      return this.sequence != null && !this.sequence.isEmpty();
2746    }
2747
2748    public boolean hasSequence() {
2749      return this.sequence != null && !this.sequence.isEmpty();
2750    }
2751
2752    /**
2753     * @param value {@link #sequence} (A number to uniquely identify procedure
2754     *              entries.). This is the underlying object with id, value and
2755     *              extensions. The accessor "getSequence" gives direct access to
2756     *              the value
2757     */
2758    public ProcedureComponent setSequenceElement(PositiveIntType value) {
2759      this.sequence = value;
2760      return this;
2761    }
2762
2763    /**
2764     * @return A number to uniquely identify procedure entries.
2765     */
2766    public int getSequence() {
2767      return this.sequence == null || this.sequence.isEmpty() ? 0 : this.sequence.getValue();
2768    }
2769
2770    /**
2771     * @param value A number to uniquely identify procedure entries.
2772     */
2773    public ProcedureComponent setSequence(int value) {
2774      if (this.sequence == null)
2775        this.sequence = new PositiveIntType();
2776      this.sequence.setValue(value);
2777      return this;
2778    }
2779
2780    /**
2781     * @return {@link #type} (When the condition was observed or the relative
2782     *         ranking.)
2783     */
2784    public List<CodeableConcept> getType() {
2785      if (this.type == null)
2786        this.type = new ArrayList<CodeableConcept>();
2787      return this.type;
2788    }
2789
2790    /**
2791     * @return Returns a reference to <code>this</code> for easy method chaining
2792     */
2793    public ProcedureComponent setType(List<CodeableConcept> theType) {
2794      this.type = theType;
2795      return this;
2796    }
2797
2798    public boolean hasType() {
2799      if (this.type == null)
2800        return false;
2801      for (CodeableConcept item : this.type)
2802        if (!item.isEmpty())
2803          return true;
2804      return false;
2805    }
2806
2807    public CodeableConcept addType() { // 3
2808      CodeableConcept t = new CodeableConcept();
2809      if (this.type == null)
2810        this.type = new ArrayList<CodeableConcept>();
2811      this.type.add(t);
2812      return t;
2813    }
2814
2815    public ProcedureComponent addType(CodeableConcept t) { // 3
2816      if (t == null)
2817        return this;
2818      if (this.type == null)
2819        this.type = new ArrayList<CodeableConcept>();
2820      this.type.add(t);
2821      return this;
2822    }
2823
2824    /**
2825     * @return The first repetition of repeating field {@link #type}, creating it if
2826     *         it does not already exist
2827     */
2828    public CodeableConcept getTypeFirstRep() {
2829      if (getType().isEmpty()) {
2830        addType();
2831      }
2832      return getType().get(0);
2833    }
2834
2835    /**
2836     * @return {@link #date} (Date and optionally time the procedure was
2837     *         performed.). This is the underlying object with id, value and
2838     *         extensions. The accessor "getDate" gives direct access to the value
2839     */
2840    public DateTimeType getDateElement() {
2841      if (this.date == null)
2842        if (Configuration.errorOnAutoCreate())
2843          throw new Error("Attempt to auto-create ProcedureComponent.date");
2844        else if (Configuration.doAutoCreate())
2845          this.date = new DateTimeType(); // bb
2846      return this.date;
2847    }
2848
2849    public boolean hasDateElement() {
2850      return this.date != null && !this.date.isEmpty();
2851    }
2852
2853    public boolean hasDate() {
2854      return this.date != null && !this.date.isEmpty();
2855    }
2856
2857    /**
2858     * @param value {@link #date} (Date and optionally time the procedure was
2859     *              performed.). This is the underlying object with id, value and
2860     *              extensions. The accessor "getDate" gives direct access to the
2861     *              value
2862     */
2863    public ProcedureComponent setDateElement(DateTimeType value) {
2864      this.date = value;
2865      return this;
2866    }
2867
2868    /**
2869     * @return Date and optionally time the procedure was performed.
2870     */
2871    public Date getDate() {
2872      return this.date == null ? null : this.date.getValue();
2873    }
2874
2875    /**
2876     * @param value Date and optionally time the procedure was performed.
2877     */
2878    public ProcedureComponent setDate(Date value) {
2879      if (value == null)
2880        this.date = null;
2881      else {
2882        if (this.date == null)
2883          this.date = new DateTimeType();
2884        this.date.setValue(value);
2885      }
2886      return this;
2887    }
2888
2889    /**
2890     * @return {@link #procedure} (The code or reference to a Procedure resource
2891     *         which identifies the clinical intervention performed.)
2892     */
2893    public Type getProcedure() {
2894      return this.procedure;
2895    }
2896
2897    /**
2898     * @return {@link #procedure} (The code or reference to a Procedure resource
2899     *         which identifies the clinical intervention performed.)
2900     */
2901    public CodeableConcept getProcedureCodeableConcept() throws FHIRException {
2902      if (this.procedure == null)
2903        this.procedure = new CodeableConcept();
2904      if (!(this.procedure instanceof CodeableConcept))
2905        throw new FHIRException("Type mismatch: the type CodeableConcept was expected, but "
2906            + this.procedure.getClass().getName() + " was encountered");
2907      return (CodeableConcept) this.procedure;
2908    }
2909
2910    public boolean hasProcedureCodeableConcept() {
2911      return this != null && this.procedure instanceof CodeableConcept;
2912    }
2913
2914    /**
2915     * @return {@link #procedure} (The code or reference to a Procedure resource
2916     *         which identifies the clinical intervention performed.)
2917     */
2918    public Reference getProcedureReference() throws FHIRException {
2919      if (this.procedure == null)
2920        this.procedure = new Reference();
2921      if (!(this.procedure instanceof Reference))
2922        throw new FHIRException("Type mismatch: the type Reference was expected, but "
2923            + this.procedure.getClass().getName() + " was encountered");
2924      return (Reference) this.procedure;
2925    }
2926
2927    public boolean hasProcedureReference() {
2928      return this != null && this.procedure instanceof Reference;
2929    }
2930
2931    public boolean hasProcedure() {
2932      return this.procedure != null && !this.procedure.isEmpty();
2933    }
2934
2935    /**
2936     * @param value {@link #procedure} (The code or reference to a Procedure
2937     *              resource which identifies the clinical intervention performed.)
2938     */
2939    public ProcedureComponent setProcedure(Type value) {
2940      if (value != null && !(value instanceof CodeableConcept || value instanceof Reference))
2941        throw new Error("Not the right type for Claim.procedure.procedure[x]: " + value.fhirType());
2942      this.procedure = value;
2943      return this;
2944    }
2945
2946    /**
2947     * @return {@link #udi} (Unique Device Identifiers associated with this line
2948     *         item.)
2949     */
2950    public List<Reference> getUdi() {
2951      if (this.udi == null)
2952        this.udi = new ArrayList<Reference>();
2953      return this.udi;
2954    }
2955
2956    /**
2957     * @return Returns a reference to <code>this</code> for easy method chaining
2958     */
2959    public ProcedureComponent setUdi(List<Reference> theUdi) {
2960      this.udi = theUdi;
2961      return this;
2962    }
2963
2964    public boolean hasUdi() {
2965      if (this.udi == null)
2966        return false;
2967      for (Reference item : this.udi)
2968        if (!item.isEmpty())
2969          return true;
2970      return false;
2971    }
2972
2973    public Reference addUdi() { // 3
2974      Reference t = new Reference();
2975      if (this.udi == null)
2976        this.udi = new ArrayList<Reference>();
2977      this.udi.add(t);
2978      return t;
2979    }
2980
2981    public ProcedureComponent addUdi(Reference t) { // 3
2982      if (t == null)
2983        return this;
2984      if (this.udi == null)
2985        this.udi = new ArrayList<Reference>();
2986      this.udi.add(t);
2987      return this;
2988    }
2989
2990    /**
2991     * @return The first repetition of repeating field {@link #udi}, creating it if
2992     *         it does not already exist
2993     */
2994    public Reference getUdiFirstRep() {
2995      if (getUdi().isEmpty()) {
2996        addUdi();
2997      }
2998      return getUdi().get(0);
2999    }
3000
3001    /**
3002     * @deprecated Use Reference#setResource(IBaseResource) instead
3003     */
3004    @Deprecated
3005    public List<Device> getUdiTarget() {
3006      if (this.udiTarget == null)
3007        this.udiTarget = new ArrayList<Device>();
3008      return this.udiTarget;
3009    }
3010
3011    /**
3012     * @deprecated Use Reference#setResource(IBaseResource) instead
3013     */
3014    @Deprecated
3015    public Device addUdiTarget() {
3016      Device r = new Device();
3017      if (this.udiTarget == null)
3018        this.udiTarget = new ArrayList<Device>();
3019      this.udiTarget.add(r);
3020      return r;
3021    }
3022
3023    protected void listChildren(List<Property> children) {
3024      super.listChildren(children);
3025      children.add(
3026          new Property("sequence", "positiveInt", "A number to uniquely identify procedure entries.", 0, 1, sequence));
3027      children.add(new Property("type", "CodeableConcept", "When the condition was observed or the relative ranking.",
3028          0, java.lang.Integer.MAX_VALUE, type));
3029      children
3030          .add(new Property("date", "dateTime", "Date and optionally time the procedure was performed.", 0, 1, date));
3031      children.add(new Property("procedure[x]", "CodeableConcept|Reference(Procedure)",
3032          "The code or reference to a Procedure resource which identifies the clinical intervention performed.", 0, 1,
3033          procedure));
3034      children.add(new Property("udi", "Reference(Device)", "Unique Device Identifiers associated with this line item.",
3035          0, java.lang.Integer.MAX_VALUE, udi));
3036    }
3037
3038    @Override
3039    public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
3040      switch (_hash) {
3041      case 1349547969:
3042        /* sequence */ return new Property("sequence", "positiveInt",
3043            "A number to uniquely identify procedure entries.", 0, 1, sequence);
3044      case 3575610:
3045        /* type */ return new Property("type", "CodeableConcept",
3046            "When the condition was observed or the relative ranking.", 0, java.lang.Integer.MAX_VALUE, type);
3047      case 3076014:
3048        /* date */ return new Property("date", "dateTime", "Date and optionally time the procedure was performed.", 0,
3049            1, date);
3050      case 1640074445:
3051        /* procedure[x] */ return new Property("procedure[x]", "CodeableConcept|Reference(Procedure)",
3052            "The code or reference to a Procedure resource which identifies the clinical intervention performed.", 0, 1,
3053            procedure);
3054      case -1095204141:
3055        /* procedure */ return new Property("procedure[x]", "CodeableConcept|Reference(Procedure)",
3056            "The code or reference to a Procedure resource which identifies the clinical intervention performed.", 0, 1,
3057            procedure);
3058      case -1284783026:
3059        /* procedureCodeableConcept */ return new Property("procedure[x]", "CodeableConcept|Reference(Procedure)",
3060            "The code or reference to a Procedure resource which identifies the clinical intervention performed.", 0, 1,
3061            procedure);
3062      case 881809848:
3063        /* procedureReference */ return new Property("procedure[x]", "CodeableConcept|Reference(Procedure)",
3064            "The code or reference to a Procedure resource which identifies the clinical intervention performed.", 0, 1,
3065            procedure);
3066      case 115642:
3067        /* udi */ return new Property("udi", "Reference(Device)",
3068            "Unique Device Identifiers associated with this line item.", 0, java.lang.Integer.MAX_VALUE, udi);
3069      default:
3070        return super.getNamedProperty(_hash, _name, _checkValid);
3071      }
3072
3073    }
3074
3075    @Override
3076    public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
3077      switch (hash) {
3078      case 1349547969:
3079        /* sequence */ return this.sequence == null ? new Base[0] : new Base[] { this.sequence }; // PositiveIntType
3080      case 3575610:
3081        /* type */ return this.type == null ? new Base[0] : this.type.toArray(new Base[this.type.size()]); // CodeableConcept
3082      case 3076014:
3083        /* date */ return this.date == null ? new Base[0] : new Base[] { this.date }; // DateTimeType
3084      case -1095204141:
3085        /* procedure */ return this.procedure == null ? new Base[0] : new Base[] { this.procedure }; // Type
3086      case 115642:
3087        /* udi */ return this.udi == null ? new Base[0] : this.udi.toArray(new Base[this.udi.size()]); // Reference
3088      default:
3089        return super.getProperty(hash, name, checkValid);
3090      }
3091
3092    }
3093
3094    @Override
3095    public Base setProperty(int hash, String name, Base value) throws FHIRException {
3096      switch (hash) {
3097      case 1349547969: // sequence
3098        this.sequence = castToPositiveInt(value); // PositiveIntType
3099        return value;
3100      case 3575610: // type
3101        this.getType().add(castToCodeableConcept(value)); // CodeableConcept
3102        return value;
3103      case 3076014: // date
3104        this.date = castToDateTime(value); // DateTimeType
3105        return value;
3106      case -1095204141: // procedure
3107        this.procedure = castToType(value); // Type
3108        return value;
3109      case 115642: // udi
3110        this.getUdi().add(castToReference(value)); // Reference
3111        return value;
3112      default:
3113        return super.setProperty(hash, name, value);
3114      }
3115
3116    }
3117
3118    @Override
3119    public Base setProperty(String name, Base value) throws FHIRException {
3120      if (name.equals("sequence")) {
3121        this.sequence = castToPositiveInt(value); // PositiveIntType
3122      } else if (name.equals("type")) {
3123        this.getType().add(castToCodeableConcept(value));
3124      } else if (name.equals("date")) {
3125        this.date = castToDateTime(value); // DateTimeType
3126      } else if (name.equals("procedure[x]")) {
3127        this.procedure = castToType(value); // Type
3128      } else if (name.equals("udi")) {
3129        this.getUdi().add(castToReference(value));
3130      } else
3131        return super.setProperty(name, value);
3132      return value;
3133    }
3134
3135  @Override
3136  public void removeChild(String name, Base value) throws FHIRException {
3137      if (name.equals("sequence")) {
3138        this.sequence = null;
3139      } else if (name.equals("type")) {
3140        this.getType().remove(castToCodeableConcept(value));
3141      } else if (name.equals("date")) {
3142        this.date = null;
3143      } else if (name.equals("procedure[x]")) {
3144        this.procedure = null;
3145      } else if (name.equals("udi")) {
3146        this.getUdi().remove(castToReference(value));
3147      } else
3148        super.removeChild(name, value);
3149      
3150    }
3151
3152    @Override
3153    public Base makeProperty(int hash, String name) throws FHIRException {
3154      switch (hash) {
3155      case 1349547969:
3156        return getSequenceElement();
3157      case 3575610:
3158        return addType();
3159      case 3076014:
3160        return getDateElement();
3161      case 1640074445:
3162        return getProcedure();
3163      case -1095204141:
3164        return getProcedure();
3165      case 115642:
3166        return addUdi();
3167      default:
3168        return super.makeProperty(hash, name);
3169      }
3170
3171    }
3172
3173    @Override
3174    public String[] getTypesForProperty(int hash, String name) throws FHIRException {
3175      switch (hash) {
3176      case 1349547969:
3177        /* sequence */ return new String[] { "positiveInt" };
3178      case 3575610:
3179        /* type */ return new String[] { "CodeableConcept" };
3180      case 3076014:
3181        /* date */ return new String[] { "dateTime" };
3182      case -1095204141:
3183        /* procedure */ return new String[] { "CodeableConcept", "Reference" };
3184      case 115642:
3185        /* udi */ return new String[] { "Reference" };
3186      default:
3187        return super.getTypesForProperty(hash, name);
3188      }
3189
3190    }
3191
3192    @Override
3193    public Base addChild(String name) throws FHIRException {
3194      if (name.equals("sequence")) {
3195        throw new FHIRException("Cannot call addChild on a singleton property Claim.sequence");
3196      } else if (name.equals("type")) {
3197        return addType();
3198      } else if (name.equals("date")) {
3199        throw new FHIRException("Cannot call addChild on a singleton property Claim.date");
3200      } else if (name.equals("procedureCodeableConcept")) {
3201        this.procedure = new CodeableConcept();
3202        return this.procedure;
3203      } else if (name.equals("procedureReference")) {
3204        this.procedure = new Reference();
3205        return this.procedure;
3206      } else if (name.equals("udi")) {
3207        return addUdi();
3208      } else
3209        return super.addChild(name);
3210    }
3211
3212    public ProcedureComponent copy() {
3213      ProcedureComponent dst = new ProcedureComponent();
3214      copyValues(dst);
3215      return dst;
3216    }
3217
3218    public void copyValues(ProcedureComponent dst) {
3219      super.copyValues(dst);
3220      dst.sequence = sequence == null ? null : sequence.copy();
3221      if (type != null) {
3222        dst.type = new ArrayList<CodeableConcept>();
3223        for (CodeableConcept i : type)
3224          dst.type.add(i.copy());
3225      }
3226      ;
3227      dst.date = date == null ? null : date.copy();
3228      dst.procedure = procedure == null ? null : procedure.copy();
3229      if (udi != null) {
3230        dst.udi = new ArrayList<Reference>();
3231        for (Reference i : udi)
3232          dst.udi.add(i.copy());
3233      }
3234      ;
3235    }
3236
3237    @Override
3238    public boolean equalsDeep(Base other_) {
3239      if (!super.equalsDeep(other_))
3240        return false;
3241      if (!(other_ instanceof ProcedureComponent))
3242        return false;
3243      ProcedureComponent o = (ProcedureComponent) other_;
3244      return compareDeep(sequence, o.sequence, true) && compareDeep(type, o.type, true)
3245          && compareDeep(date, o.date, true) && compareDeep(procedure, o.procedure, true)
3246          && compareDeep(udi, o.udi, true);
3247    }
3248
3249    @Override
3250    public boolean equalsShallow(Base other_) {
3251      if (!super.equalsShallow(other_))
3252        return false;
3253      if (!(other_ instanceof ProcedureComponent))
3254        return false;
3255      ProcedureComponent o = (ProcedureComponent) other_;
3256      return compareValues(sequence, o.sequence, true) && compareValues(date, o.date, true);
3257    }
3258
3259    public boolean isEmpty() {
3260      return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(sequence, type, date, procedure, udi);
3261    }
3262
3263    public String fhirType() {
3264      return "Claim.procedure";
3265
3266    }
3267
3268  }
3269
3270  @Block()
3271  public static class InsuranceComponent extends BackboneElement implements IBaseBackboneElement {
3272    /**
3273     * A number to uniquely identify insurance entries and provide a sequence of
3274     * coverages to convey coordination of benefit order.
3275     */
3276    @Child(name = "sequence", type = {
3277        PositiveIntType.class }, order = 1, min = 1, max = 1, modifier = false, summary = true)
3278    @Description(shortDefinition = "Insurance instance identifier", formalDefinition = "A number to uniquely identify insurance entries and provide a sequence of coverages to convey coordination of benefit order.")
3279    protected PositiveIntType sequence;
3280
3281    /**
3282     * A flag to indicate that this Coverage is to be used for adjudication of this
3283     * claim when set to true.
3284     */
3285    @Child(name = "focal", type = { BooleanType.class }, order = 2, min = 1, max = 1, modifier = false, summary = true)
3286    @Description(shortDefinition = "Coverage to be used for adjudication", formalDefinition = "A flag to indicate that this Coverage is to be used for adjudication of this claim when set to true.")
3287    protected BooleanType focal;
3288
3289    /**
3290     * The business identifier to be used when the claim is sent for adjudication
3291     * against this insurance policy.
3292     */
3293    @Child(name = "identifier", type = {
3294        Identifier.class }, order = 3, min = 0, max = 1, modifier = false, summary = false)
3295    @Description(shortDefinition = "Pre-assigned Claim number", formalDefinition = "The business identifier to be used when the claim is sent for adjudication against this insurance policy.")
3296    protected Identifier identifier;
3297
3298    /**
3299     * Reference to the insurance card level information contained in the Coverage
3300     * resource. The coverage issuing insurer will use these details to locate the
3301     * patient's actual coverage within the insurer's information system.
3302     */
3303    @Child(name = "coverage", type = { Coverage.class }, order = 4, min = 1, max = 1, modifier = false, summary = true)
3304    @Description(shortDefinition = "Insurance information", formalDefinition = "Reference to the insurance card level information contained in the Coverage resource. The coverage issuing insurer will use these details to locate the patient's actual coverage within the insurer's information system.")
3305    protected Reference coverage;
3306
3307    /**
3308     * The actual object that is the target of the reference (Reference to the
3309     * insurance card level information contained in the Coverage resource. The
3310     * coverage issuing insurer will use these details to locate the patient's
3311     * actual coverage within the insurer's information system.)
3312     */
3313    protected Coverage coverageTarget;
3314
3315    /**
3316     * A business agreement number established between the provider and the insurer
3317     * for special business processing purposes.
3318     */
3319    @Child(name = "businessArrangement", type = {
3320        StringType.class }, order = 5, min = 0, max = 1, modifier = false, summary = false)
3321    @Description(shortDefinition = "Additional provider contract number", formalDefinition = "A business agreement number established between the provider and the insurer for special business processing purposes.")
3322    protected StringType businessArrangement;
3323
3324    /**
3325     * Reference numbers previously provided by the insurer to the provider to be
3326     * quoted on subsequent claims containing services or products related to the
3327     * prior authorization.
3328     */
3329    @Child(name = "preAuthRef", type = {
3330        StringType.class }, order = 6, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
3331    @Description(shortDefinition = "Prior authorization reference number", formalDefinition = "Reference numbers previously provided by the insurer to the provider to be quoted on subsequent claims containing services or products related to the prior authorization.")
3332    protected List<StringType> preAuthRef;
3333
3334    /**
3335     * The result of the adjudication of the line items for the Coverage specified
3336     * in this insurance.
3337     */
3338    @Child(name = "claimResponse", type = {
3339        ClaimResponse.class }, order = 7, min = 0, max = 1, modifier = false, summary = false)
3340    @Description(shortDefinition = "Adjudication results", formalDefinition = "The result of the adjudication of the line items for the Coverage specified in this insurance.")
3341    protected Reference claimResponse;
3342
3343    /**
3344     * The actual object that is the target of the reference (The result of the
3345     * adjudication of the line items for the Coverage specified in this insurance.)
3346     */
3347    protected ClaimResponse claimResponseTarget;
3348
3349    private static final long serialVersionUID = -1711744215L;
3350
3351    /**
3352     * Constructor
3353     */
3354    public InsuranceComponent() {
3355      super();
3356    }
3357
3358    /**
3359     * Constructor
3360     */
3361    public InsuranceComponent(PositiveIntType sequence, BooleanType focal, Reference coverage) {
3362      super();
3363      this.sequence = sequence;
3364      this.focal = focal;
3365      this.coverage = coverage;
3366    }
3367
3368    /**
3369     * @return {@link #sequence} (A number to uniquely identify insurance entries
3370     *         and provide a sequence of coverages to convey coordination of benefit
3371     *         order.). This is the underlying object with id, value and extensions.
3372     *         The accessor "getSequence" gives direct access to the value
3373     */
3374    public PositiveIntType getSequenceElement() {
3375      if (this.sequence == null)
3376        if (Configuration.errorOnAutoCreate())
3377          throw new Error("Attempt to auto-create InsuranceComponent.sequence");
3378        else if (Configuration.doAutoCreate())
3379          this.sequence = new PositiveIntType(); // bb
3380      return this.sequence;
3381    }
3382
3383    public boolean hasSequenceElement() {
3384      return this.sequence != null && !this.sequence.isEmpty();
3385    }
3386
3387    public boolean hasSequence() {
3388      return this.sequence != null && !this.sequence.isEmpty();
3389    }
3390
3391    /**
3392     * @param value {@link #sequence} (A number to uniquely identify insurance
3393     *              entries and provide a sequence of coverages to convey
3394     *              coordination of benefit order.). This is the underlying object
3395     *              with id, value and extensions. The accessor "getSequence" gives
3396     *              direct access to the value
3397     */
3398    public InsuranceComponent setSequenceElement(PositiveIntType value) {
3399      this.sequence = value;
3400      return this;
3401    }
3402
3403    /**
3404     * @return A number to uniquely identify insurance entries and provide a
3405     *         sequence of coverages to convey coordination of benefit order.
3406     */
3407    public int getSequence() {
3408      return this.sequence == null || this.sequence.isEmpty() ? 0 : this.sequence.getValue();
3409    }
3410
3411    /**
3412     * @param value A number to uniquely identify insurance entries and provide a
3413     *              sequence of coverages to convey coordination of benefit order.
3414     */
3415    public InsuranceComponent setSequence(int value) {
3416      if (this.sequence == null)
3417        this.sequence = new PositiveIntType();
3418      this.sequence.setValue(value);
3419      return this;
3420    }
3421
3422    /**
3423     * @return {@link #focal} (A flag to indicate that this Coverage is to be used
3424     *         for adjudication of this claim when set to true.). This is the
3425     *         underlying object with id, value and extensions. The accessor
3426     *         "getFocal" gives direct access to the value
3427     */
3428    public BooleanType getFocalElement() {
3429      if (this.focal == null)
3430        if (Configuration.errorOnAutoCreate())
3431          throw new Error("Attempt to auto-create InsuranceComponent.focal");
3432        else if (Configuration.doAutoCreate())
3433          this.focal = new BooleanType(); // bb
3434      return this.focal;
3435    }
3436
3437    public boolean hasFocalElement() {
3438      return this.focal != null && !this.focal.isEmpty();
3439    }
3440
3441    public boolean hasFocal() {
3442      return this.focal != null && !this.focal.isEmpty();
3443    }
3444
3445    /**
3446     * @param value {@link #focal} (A flag to indicate that this Coverage is to be
3447     *              used for adjudication of this claim when set to true.). This is
3448     *              the underlying object with id, value and extensions. The
3449     *              accessor "getFocal" gives direct access to the value
3450     */
3451    public InsuranceComponent setFocalElement(BooleanType value) {
3452      this.focal = value;
3453      return this;
3454    }
3455
3456    /**
3457     * @return A flag to indicate that this Coverage is to be used for adjudication
3458     *         of this claim when set to true.
3459     */
3460    public boolean getFocal() {
3461      return this.focal == null || this.focal.isEmpty() ? false : this.focal.getValue();
3462    }
3463
3464    /**
3465     * @param value A flag to indicate that this Coverage is to be used for
3466     *              adjudication of this claim when set to true.
3467     */
3468    public InsuranceComponent setFocal(boolean value) {
3469      if (this.focal == null)
3470        this.focal = new BooleanType();
3471      this.focal.setValue(value);
3472      return this;
3473    }
3474
3475    /**
3476     * @return {@link #identifier} (The business identifier to be used when the
3477     *         claim is sent for adjudication against this insurance policy.)
3478     */
3479    public Identifier getIdentifier() {
3480      if (this.identifier == null)
3481        if (Configuration.errorOnAutoCreate())
3482          throw new Error("Attempt to auto-create InsuranceComponent.identifier");
3483        else if (Configuration.doAutoCreate())
3484          this.identifier = new Identifier(); // cc
3485      return this.identifier;
3486    }
3487
3488    public boolean hasIdentifier() {
3489      return this.identifier != null && !this.identifier.isEmpty();
3490    }
3491
3492    /**
3493     * @param value {@link #identifier} (The business identifier to be used when the
3494     *              claim is sent for adjudication against this insurance policy.)
3495     */
3496    public InsuranceComponent setIdentifier(Identifier value) {
3497      this.identifier = value;
3498      return this;
3499    }
3500
3501    /**
3502     * @return {@link #coverage} (Reference to the insurance card level information
3503     *         contained in the Coverage resource. The coverage issuing insurer will
3504     *         use these details to locate the patient's actual coverage within the
3505     *         insurer's information system.)
3506     */
3507    public Reference getCoverage() {
3508      if (this.coverage == null)
3509        if (Configuration.errorOnAutoCreate())
3510          throw new Error("Attempt to auto-create InsuranceComponent.coverage");
3511        else if (Configuration.doAutoCreate())
3512          this.coverage = new Reference(); // cc
3513      return this.coverage;
3514    }
3515
3516    public boolean hasCoverage() {
3517      return this.coverage != null && !this.coverage.isEmpty();
3518    }
3519
3520    /**
3521     * @param value {@link #coverage} (Reference to the insurance card level
3522     *              information contained in the Coverage resource. The coverage
3523     *              issuing insurer will use these details to locate the patient's
3524     *              actual coverage within the insurer's information system.)
3525     */
3526    public InsuranceComponent setCoverage(Reference value) {
3527      this.coverage = value;
3528      return this;
3529    }
3530
3531    /**
3532     * @return {@link #coverage} The actual object that is the target of the
3533     *         reference. The reference library doesn't populate this, but you can
3534     *         use it to hold the resource if you resolve it. (Reference to the
3535     *         insurance card level information contained in the Coverage resource.
3536     *         The coverage issuing insurer will use these details to locate the
3537     *         patient's actual coverage within the insurer's information system.)
3538     */
3539    public Coverage getCoverageTarget() {
3540      if (this.coverageTarget == null)
3541        if (Configuration.errorOnAutoCreate())
3542          throw new Error("Attempt to auto-create InsuranceComponent.coverage");
3543        else if (Configuration.doAutoCreate())
3544          this.coverageTarget = new Coverage(); // aa
3545      return this.coverageTarget;
3546    }
3547
3548    /**
3549     * @param value {@link #coverage} The actual object that is the target of the
3550     *              reference. The reference library doesn't use these, but you can
3551     *              use it to hold the resource if you resolve it. (Reference to the
3552     *              insurance card level information contained in the Coverage
3553     *              resource. The coverage issuing insurer will use these details to
3554     *              locate the patient's actual coverage within the insurer's
3555     *              information system.)
3556     */
3557    public InsuranceComponent setCoverageTarget(Coverage value) {
3558      this.coverageTarget = value;
3559      return this;
3560    }
3561
3562    /**
3563     * @return {@link #businessArrangement} (A business agreement number established
3564     *         between the provider and the insurer for special business processing
3565     *         purposes.). This is the underlying object with id, value and
3566     *         extensions. The accessor "getBusinessArrangement" gives direct access
3567     *         to the value
3568     */
3569    public StringType getBusinessArrangementElement() {
3570      if (this.businessArrangement == null)
3571        if (Configuration.errorOnAutoCreate())
3572          throw new Error("Attempt to auto-create InsuranceComponent.businessArrangement");
3573        else if (Configuration.doAutoCreate())
3574          this.businessArrangement = new StringType(); // bb
3575      return this.businessArrangement;
3576    }
3577
3578    public boolean hasBusinessArrangementElement() {
3579      return this.businessArrangement != null && !this.businessArrangement.isEmpty();
3580    }
3581
3582    public boolean hasBusinessArrangement() {
3583      return this.businessArrangement != null && !this.businessArrangement.isEmpty();
3584    }
3585
3586    /**
3587     * @param value {@link #businessArrangement} (A business agreement number
3588     *              established between the provider and the insurer for special
3589     *              business processing purposes.). This is the underlying object
3590     *              with id, value and extensions. The accessor
3591     *              "getBusinessArrangement" gives direct access to the value
3592     */
3593    public InsuranceComponent setBusinessArrangementElement(StringType value) {
3594      this.businessArrangement = value;
3595      return this;
3596    }
3597
3598    /**
3599     * @return A business agreement number established between the provider and the
3600     *         insurer for special business processing purposes.
3601     */
3602    public String getBusinessArrangement() {
3603      return this.businessArrangement == null ? null : this.businessArrangement.getValue();
3604    }
3605
3606    /**
3607     * @param value A business agreement number established between the provider and
3608     *              the insurer for special business processing purposes.
3609     */
3610    public InsuranceComponent setBusinessArrangement(String value) {
3611      if (Utilities.noString(value))
3612        this.businessArrangement = null;
3613      else {
3614        if (this.businessArrangement == null)
3615          this.businessArrangement = new StringType();
3616        this.businessArrangement.setValue(value);
3617      }
3618      return this;
3619    }
3620
3621    /**
3622     * @return {@link #preAuthRef} (Reference numbers previously provided by the
3623     *         insurer to the provider to be quoted on subsequent claims containing
3624     *         services or products related to the prior authorization.)
3625     */
3626    public List<StringType> getPreAuthRef() {
3627      if (this.preAuthRef == null)
3628        this.preAuthRef = new ArrayList<StringType>();
3629      return this.preAuthRef;
3630    }
3631
3632    /**
3633     * @return Returns a reference to <code>this</code> for easy method chaining
3634     */
3635    public InsuranceComponent setPreAuthRef(List<StringType> thePreAuthRef) {
3636      this.preAuthRef = thePreAuthRef;
3637      return this;
3638    }
3639
3640    public boolean hasPreAuthRef() {
3641      if (this.preAuthRef == null)
3642        return false;
3643      for (StringType item : this.preAuthRef)
3644        if (!item.isEmpty())
3645          return true;
3646      return false;
3647    }
3648
3649    /**
3650     * @return {@link #preAuthRef} (Reference numbers previously provided by the
3651     *         insurer to the provider to be quoted on subsequent claims containing
3652     *         services or products related to the prior authorization.)
3653     */
3654    public StringType addPreAuthRefElement() {// 2
3655      StringType t = new StringType();
3656      if (this.preAuthRef == null)
3657        this.preAuthRef = new ArrayList<StringType>();
3658      this.preAuthRef.add(t);
3659      return t;
3660    }
3661
3662    /**
3663     * @param value {@link #preAuthRef} (Reference numbers previously provided by
3664     *              the insurer to the provider to be quoted on subsequent claims
3665     *              containing services or products related to the prior
3666     *              authorization.)
3667     */
3668    public InsuranceComponent addPreAuthRef(String value) { // 1
3669      StringType t = new StringType();
3670      t.setValue(value);
3671      if (this.preAuthRef == null)
3672        this.preAuthRef = new ArrayList<StringType>();
3673      this.preAuthRef.add(t);
3674      return this;
3675    }
3676
3677    /**
3678     * @param value {@link #preAuthRef} (Reference numbers previously provided by
3679     *              the insurer to the provider to be quoted on subsequent claims
3680     *              containing services or products related to the prior
3681     *              authorization.)
3682     */
3683    public boolean hasPreAuthRef(String value) {
3684      if (this.preAuthRef == null)
3685        return false;
3686      for (StringType v : this.preAuthRef)
3687        if (v.getValue().equals(value)) // string
3688          return true;
3689      return false;
3690    }
3691
3692    /**
3693     * @return {@link #claimResponse} (The result of the adjudication of the line
3694     *         items for the Coverage specified in this insurance.)
3695     */
3696    public Reference getClaimResponse() {
3697      if (this.claimResponse == null)
3698        if (Configuration.errorOnAutoCreate())
3699          throw new Error("Attempt to auto-create InsuranceComponent.claimResponse");
3700        else if (Configuration.doAutoCreate())
3701          this.claimResponse = new Reference(); // cc
3702      return this.claimResponse;
3703    }
3704
3705    public boolean hasClaimResponse() {
3706      return this.claimResponse != null && !this.claimResponse.isEmpty();
3707    }
3708
3709    /**
3710     * @param value {@link #claimResponse} (The result of the adjudication of the
3711     *              line items for the Coverage specified in this insurance.)
3712     */
3713    public InsuranceComponent setClaimResponse(Reference value) {
3714      this.claimResponse = value;
3715      return this;
3716    }
3717
3718    /**
3719     * @return {@link #claimResponse} The actual object that is the target of the
3720     *         reference. The reference library doesn't populate this, but you can
3721     *         use it to hold the resource if you resolve it. (The result of the
3722     *         adjudication of the line items for the Coverage specified in this
3723     *         insurance.)
3724     */
3725    public ClaimResponse getClaimResponseTarget() {
3726      if (this.claimResponseTarget == null)
3727        if (Configuration.errorOnAutoCreate())
3728          throw new Error("Attempt to auto-create InsuranceComponent.claimResponse");
3729        else if (Configuration.doAutoCreate())
3730          this.claimResponseTarget = new ClaimResponse(); // aa
3731      return this.claimResponseTarget;
3732    }
3733
3734    /**
3735     * @param value {@link #claimResponse} The actual object that is the target of
3736     *              the reference. The reference library doesn't use these, but you
3737     *              can use it to hold the resource if you resolve it. (The result
3738     *              of the adjudication of the line items for the Coverage specified
3739     *              in this insurance.)
3740     */
3741    public InsuranceComponent setClaimResponseTarget(ClaimResponse value) {
3742      this.claimResponseTarget = value;
3743      return this;
3744    }
3745
3746    protected void listChildren(List<Property> children) {
3747      super.listChildren(children);
3748      children.add(new Property("sequence", "positiveInt",
3749          "A number to uniquely identify insurance entries and provide a sequence of coverages to convey coordination of benefit order.",
3750          0, 1, sequence));
3751      children.add(new Property("focal", "boolean",
3752          "A flag to indicate that this Coverage is to be used for adjudication of this claim when set to true.", 0, 1,
3753          focal));
3754      children.add(new Property("identifier", "Identifier",
3755          "The business identifier to be used when the claim is sent for adjudication against this insurance policy.",
3756          0, 1, identifier));
3757      children.add(new Property("coverage", "Reference(Coverage)",
3758          "Reference to the insurance card level information contained in the Coverage resource. The coverage issuing insurer will use these details to locate the patient's actual coverage within the insurer's information system.",
3759          0, 1, coverage));
3760      children.add(new Property("businessArrangement", "string",
3761          "A business agreement number established between the provider and the insurer for special business processing purposes.",
3762          0, 1, businessArrangement));
3763      children.add(new Property("preAuthRef", "string",
3764          "Reference numbers previously provided by the insurer to the provider to be quoted on subsequent claims containing services or products related to the prior authorization.",
3765          0, java.lang.Integer.MAX_VALUE, preAuthRef));
3766      children.add(new Property("claimResponse", "Reference(ClaimResponse)",
3767          "The result of the adjudication of the line items for the Coverage specified in this insurance.", 0, 1,
3768          claimResponse));
3769    }
3770
3771    @Override
3772    public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
3773      switch (_hash) {
3774      case 1349547969:
3775        /* sequence */ return new Property("sequence", "positiveInt",
3776            "A number to uniquely identify insurance entries and provide a sequence of coverages to convey coordination of benefit order.",
3777            0, 1, sequence);
3778      case 97604197:
3779        /* focal */ return new Property("focal", "boolean",
3780            "A flag to indicate that this Coverage is to be used for adjudication of this claim when set to true.", 0,
3781            1, focal);
3782      case -1618432855:
3783        /* identifier */ return new Property("identifier", "Identifier",
3784            "The business identifier to be used when the claim is sent for adjudication against this insurance policy.",
3785            0, 1, identifier);
3786      case -351767064:
3787        /* coverage */ return new Property("coverage", "Reference(Coverage)",
3788            "Reference to the insurance card level information contained in the Coverage resource. The coverage issuing insurer will use these details to locate the patient's actual coverage within the insurer's information system.",
3789            0, 1, coverage);
3790      case 259920682:
3791        /* businessArrangement */ return new Property("businessArrangement", "string",
3792            "A business agreement number established between the provider and the insurer for special business processing purposes.",
3793            0, 1, businessArrangement);
3794      case 522246568:
3795        /* preAuthRef */ return new Property("preAuthRef", "string",
3796            "Reference numbers previously provided by the insurer to the provider to be quoted on subsequent claims containing services or products related to the prior authorization.",
3797            0, java.lang.Integer.MAX_VALUE, preAuthRef);
3798      case 689513629:
3799        /* claimResponse */ return new Property("claimResponse", "Reference(ClaimResponse)",
3800            "The result of the adjudication of the line items for the Coverage specified in this insurance.", 0, 1,
3801            claimResponse);
3802      default:
3803        return super.getNamedProperty(_hash, _name, _checkValid);
3804      }
3805
3806    }
3807
3808    @Override
3809    public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
3810      switch (hash) {
3811      case 1349547969:
3812        /* sequence */ return this.sequence == null ? new Base[0] : new Base[] { this.sequence }; // PositiveIntType
3813      case 97604197:
3814        /* focal */ return this.focal == null ? new Base[0] : new Base[] { this.focal }; // BooleanType
3815      case -1618432855:
3816        /* identifier */ return this.identifier == null ? new Base[0] : new Base[] { this.identifier }; // Identifier
3817      case -351767064:
3818        /* coverage */ return this.coverage == null ? new Base[0] : new Base[] { this.coverage }; // Reference
3819      case 259920682:
3820        /* businessArrangement */ return this.businessArrangement == null ? new Base[0]
3821            : new Base[] { this.businessArrangement }; // StringType
3822      case 522246568:
3823        /* preAuthRef */ return this.preAuthRef == null ? new Base[0]
3824            : this.preAuthRef.toArray(new Base[this.preAuthRef.size()]); // StringType
3825      case 689513629:
3826        /* claimResponse */ return this.claimResponse == null ? new Base[0] : new Base[] { this.claimResponse }; // Reference
3827      default:
3828        return super.getProperty(hash, name, checkValid);
3829      }
3830
3831    }
3832
3833    @Override
3834    public Base setProperty(int hash, String name, Base value) throws FHIRException {
3835      switch (hash) {
3836      case 1349547969: // sequence
3837        this.sequence = castToPositiveInt(value); // PositiveIntType
3838        return value;
3839      case 97604197: // focal
3840        this.focal = castToBoolean(value); // BooleanType
3841        return value;
3842      case -1618432855: // identifier
3843        this.identifier = castToIdentifier(value); // Identifier
3844        return value;
3845      case -351767064: // coverage
3846        this.coverage = castToReference(value); // Reference
3847        return value;
3848      case 259920682: // businessArrangement
3849        this.businessArrangement = castToString(value); // StringType
3850        return value;
3851      case 522246568: // preAuthRef
3852        this.getPreAuthRef().add(castToString(value)); // StringType
3853        return value;
3854      case 689513629: // claimResponse
3855        this.claimResponse = castToReference(value); // Reference
3856        return value;
3857      default:
3858        return super.setProperty(hash, name, value);
3859      }
3860
3861    }
3862
3863    @Override
3864    public Base setProperty(String name, Base value) throws FHIRException {
3865      if (name.equals("sequence")) {
3866        this.sequence = castToPositiveInt(value); // PositiveIntType
3867      } else if (name.equals("focal")) {
3868        this.focal = castToBoolean(value); // BooleanType
3869      } else if (name.equals("identifier")) {
3870        this.identifier = castToIdentifier(value); // Identifier
3871      } else if (name.equals("coverage")) {
3872        this.coverage = castToReference(value); // Reference
3873      } else if (name.equals("businessArrangement")) {
3874        this.businessArrangement = castToString(value); // StringType
3875      } else if (name.equals("preAuthRef")) {
3876        this.getPreAuthRef().add(castToString(value));
3877      } else if (name.equals("claimResponse")) {
3878        this.claimResponse = castToReference(value); // Reference
3879      } else
3880        return super.setProperty(name, value);
3881      return value;
3882    }
3883
3884  @Override
3885  public void removeChild(String name, Base value) throws FHIRException {
3886      if (name.equals("sequence")) {
3887        this.sequence = null;
3888      } else if (name.equals("focal")) {
3889        this.focal = null;
3890      } else if (name.equals("identifier")) {
3891        this.identifier = null;
3892      } else if (name.equals("coverage")) {
3893        this.coverage = null;
3894      } else if (name.equals("businessArrangement")) {
3895        this.businessArrangement = null;
3896      } else if (name.equals("preAuthRef")) {
3897        this.getPreAuthRef().remove(castToString(value));
3898      } else if (name.equals("claimResponse")) {
3899        this.claimResponse = null;
3900      } else
3901        super.removeChild(name, value);
3902      
3903    }
3904
3905    @Override
3906    public Base makeProperty(int hash, String name) throws FHIRException {
3907      switch (hash) {
3908      case 1349547969:
3909        return getSequenceElement();
3910      case 97604197:
3911        return getFocalElement();
3912      case -1618432855:
3913        return getIdentifier();
3914      case -351767064:
3915        return getCoverage();
3916      case 259920682:
3917        return getBusinessArrangementElement();
3918      case 522246568:
3919        return addPreAuthRefElement();
3920      case 689513629:
3921        return getClaimResponse();
3922      default:
3923        return super.makeProperty(hash, name);
3924      }
3925
3926    }
3927
3928    @Override
3929    public String[] getTypesForProperty(int hash, String name) throws FHIRException {
3930      switch (hash) {
3931      case 1349547969:
3932        /* sequence */ return new String[] { "positiveInt" };
3933      case 97604197:
3934        /* focal */ return new String[] { "boolean" };
3935      case -1618432855:
3936        /* identifier */ return new String[] { "Identifier" };
3937      case -351767064:
3938        /* coverage */ return new String[] { "Reference" };
3939      case 259920682:
3940        /* businessArrangement */ return new String[] { "string" };
3941      case 522246568:
3942        /* preAuthRef */ return new String[] { "string" };
3943      case 689513629:
3944        /* claimResponse */ return new String[] { "Reference" };
3945      default:
3946        return super.getTypesForProperty(hash, name);
3947      }
3948
3949    }
3950
3951    @Override
3952    public Base addChild(String name) throws FHIRException {
3953      if (name.equals("sequence")) {
3954        throw new FHIRException("Cannot call addChild on a singleton property Claim.sequence");
3955      } else if (name.equals("focal")) {
3956        throw new FHIRException("Cannot call addChild on a singleton property Claim.focal");
3957      } else if (name.equals("identifier")) {
3958        this.identifier = new Identifier();
3959        return this.identifier;
3960      } else if (name.equals("coverage")) {
3961        this.coverage = new Reference();
3962        return this.coverage;
3963      } else if (name.equals("businessArrangement")) {
3964        throw new FHIRException("Cannot call addChild on a singleton property Claim.businessArrangement");
3965      } else if (name.equals("preAuthRef")) {
3966        throw new FHIRException("Cannot call addChild on a singleton property Claim.preAuthRef");
3967      } else if (name.equals("claimResponse")) {
3968        this.claimResponse = new Reference();
3969        return this.claimResponse;
3970      } else
3971        return super.addChild(name);
3972    }
3973
3974    public InsuranceComponent copy() {
3975      InsuranceComponent dst = new InsuranceComponent();
3976      copyValues(dst);
3977      return dst;
3978    }
3979
3980    public void copyValues(InsuranceComponent dst) {
3981      super.copyValues(dst);
3982      dst.sequence = sequence == null ? null : sequence.copy();
3983      dst.focal = focal == null ? null : focal.copy();
3984      dst.identifier = identifier == null ? null : identifier.copy();
3985      dst.coverage = coverage == null ? null : coverage.copy();
3986      dst.businessArrangement = businessArrangement == null ? null : businessArrangement.copy();
3987      if (preAuthRef != null) {
3988        dst.preAuthRef = new ArrayList<StringType>();
3989        for (StringType i : preAuthRef)
3990          dst.preAuthRef.add(i.copy());
3991      }
3992      ;
3993      dst.claimResponse = claimResponse == null ? null : claimResponse.copy();
3994    }
3995
3996    @Override
3997    public boolean equalsDeep(Base other_) {
3998      if (!super.equalsDeep(other_))
3999        return false;
4000      if (!(other_ instanceof InsuranceComponent))
4001        return false;
4002      InsuranceComponent o = (InsuranceComponent) other_;
4003      return compareDeep(sequence, o.sequence, true) && compareDeep(focal, o.focal, true)
4004          && compareDeep(identifier, o.identifier, true) && compareDeep(coverage, o.coverage, true)
4005          && compareDeep(businessArrangement, o.businessArrangement, true)
4006          && compareDeep(preAuthRef, o.preAuthRef, true) && compareDeep(claimResponse, o.claimResponse, true);
4007    }
4008
4009    @Override
4010    public boolean equalsShallow(Base other_) {
4011      if (!super.equalsShallow(other_))
4012        return false;
4013      if (!(other_ instanceof InsuranceComponent))
4014        return false;
4015      InsuranceComponent o = (InsuranceComponent) other_;
4016      return compareValues(sequence, o.sequence, true) && compareValues(focal, o.focal, true)
4017          && compareValues(businessArrangement, o.businessArrangement, true)
4018          && compareValues(preAuthRef, o.preAuthRef, true);
4019    }
4020
4021    public boolean isEmpty() {
4022      return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(sequence, focal, identifier, coverage,
4023          businessArrangement, preAuthRef, claimResponse);
4024    }
4025
4026    public String fhirType() {
4027      return "Claim.insurance";
4028
4029    }
4030
4031  }
4032
4033  @Block()
4034  public static class AccidentComponent extends BackboneElement implements IBaseBackboneElement {
4035    /**
4036     * Date of an accident event related to the products and services contained in
4037     * the claim.
4038     */
4039    @Child(name = "date", type = { DateType.class }, order = 1, min = 1, max = 1, modifier = false, summary = false)
4040    @Description(shortDefinition = "When the incident occurred", formalDefinition = "Date of an accident event  related to the products and services contained in the claim.")
4041    protected DateType date;
4042
4043    /**
4044     * The type or context of the accident event for the purposes of selection of
4045     * potential insurance coverages and determination of coordination between
4046     * insurers.
4047     */
4048    @Child(name = "type", type = {
4049        CodeableConcept.class }, order = 2, min = 0, max = 1, modifier = false, summary = false)
4050    @Description(shortDefinition = "The nature of the accident", formalDefinition = "The type or context of the accident event for the purposes of selection of potential insurance coverages and determination of coordination between insurers.")
4051    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://terminology.hl7.org/ValueSet/v3-ActIncidentCode")
4052    protected CodeableConcept type;
4053
4054    /**
4055     * The physical location of the accident event.
4056     */
4057    @Child(name = "location", type = { Address.class,
4058        Location.class }, order = 3, min = 0, max = 1, modifier = false, summary = false)
4059    @Description(shortDefinition = "Where the event occurred", formalDefinition = "The physical location of the accident event.")
4060    protected Type location;
4061
4062    private static final long serialVersionUID = 622904984L;
4063
4064    /**
4065     * Constructor
4066     */
4067    public AccidentComponent() {
4068      super();
4069    }
4070
4071    /**
4072     * Constructor
4073     */
4074    public AccidentComponent(DateType date) {
4075      super();
4076      this.date = date;
4077    }
4078
4079    /**
4080     * @return {@link #date} (Date of an accident event related to the products and
4081     *         services contained in the claim.). This is the underlying object with
4082     *         id, value and extensions. The accessor "getDate" gives direct access
4083     *         to the value
4084     */
4085    public DateType getDateElement() {
4086      if (this.date == null)
4087        if (Configuration.errorOnAutoCreate())
4088          throw new Error("Attempt to auto-create AccidentComponent.date");
4089        else if (Configuration.doAutoCreate())
4090          this.date = new DateType(); // bb
4091      return this.date;
4092    }
4093
4094    public boolean hasDateElement() {
4095      return this.date != null && !this.date.isEmpty();
4096    }
4097
4098    public boolean hasDate() {
4099      return this.date != null && !this.date.isEmpty();
4100    }
4101
4102    /**
4103     * @param value {@link #date} (Date of an accident event related to the products
4104     *              and services contained in the claim.). This is the underlying
4105     *              object with id, value and extensions. The accessor "getDate"
4106     *              gives direct access to the value
4107     */
4108    public AccidentComponent setDateElement(DateType value) {
4109      this.date = value;
4110      return this;
4111    }
4112
4113    /**
4114     * @return Date of an accident event related to the products and services
4115     *         contained in the claim.
4116     */
4117    public Date getDate() {
4118      return this.date == null ? null : this.date.getValue();
4119    }
4120
4121    /**
4122     * @param value Date of an accident event related to the products and services
4123     *              contained in the claim.
4124     */
4125    public AccidentComponent setDate(Date value) {
4126      if (this.date == null)
4127        this.date = new DateType();
4128      this.date.setValue(value);
4129      return this;
4130    }
4131
4132    /**
4133     * @return {@link #type} (The type or context of the accident event for the
4134     *         purposes of selection of potential insurance coverages and
4135     *         determination of coordination between insurers.)
4136     */
4137    public CodeableConcept getType() {
4138      if (this.type == null)
4139        if (Configuration.errorOnAutoCreate())
4140          throw new Error("Attempt to auto-create AccidentComponent.type");
4141        else if (Configuration.doAutoCreate())
4142          this.type = new CodeableConcept(); // cc
4143      return this.type;
4144    }
4145
4146    public boolean hasType() {
4147      return this.type != null && !this.type.isEmpty();
4148    }
4149
4150    /**
4151     * @param value {@link #type} (The type or context of the accident event for the
4152     *              purposes of selection of potential insurance coverages and
4153     *              determination of coordination between insurers.)
4154     */
4155    public AccidentComponent setType(CodeableConcept value) {
4156      this.type = value;
4157      return this;
4158    }
4159
4160    /**
4161     * @return {@link #location} (The physical location of the accident event.)
4162     */
4163    public Type getLocation() {
4164      return this.location;
4165    }
4166
4167    /**
4168     * @return {@link #location} (The physical location of the accident event.)
4169     */
4170    public Address getLocationAddress() throws FHIRException {
4171      if (this.location == null)
4172        this.location = new Address();
4173      if (!(this.location instanceof Address))
4174        throw new FHIRException("Type mismatch: the type Address was expected, but "
4175            + this.location.getClass().getName() + " was encountered");
4176      return (Address) this.location;
4177    }
4178
4179    public boolean hasLocationAddress() {
4180      return this != null && this.location instanceof Address;
4181    }
4182
4183    /**
4184     * @return {@link #location} (The physical location of the accident event.)
4185     */
4186    public Reference getLocationReference() throws FHIRException {
4187      if (this.location == null)
4188        this.location = new Reference();
4189      if (!(this.location instanceof Reference))
4190        throw new FHIRException("Type mismatch: the type Reference was expected, but "
4191            + this.location.getClass().getName() + " was encountered");
4192      return (Reference) this.location;
4193    }
4194
4195    public boolean hasLocationReference() {
4196      return this != null && this.location instanceof Reference;
4197    }
4198
4199    public boolean hasLocation() {
4200      return this.location != null && !this.location.isEmpty();
4201    }
4202
4203    /**
4204     * @param value {@link #location} (The physical location of the accident event.)
4205     */
4206    public AccidentComponent setLocation(Type value) {
4207      if (value != null && !(value instanceof Address || value instanceof Reference))
4208        throw new Error("Not the right type for Claim.accident.location[x]: " + value.fhirType());
4209      this.location = value;
4210      return this;
4211    }
4212
4213    protected void listChildren(List<Property> children) {
4214      super.listChildren(children);
4215      children.add(new Property("date", "date",
4216          "Date of an accident event  related to the products and services contained in the claim.", 0, 1, date));
4217      children.add(new Property("type", "CodeableConcept",
4218          "The type or context of the accident event for the purposes of selection of potential insurance coverages and determination of coordination between insurers.",
4219          0, 1, type));
4220      children.add(new Property("location[x]", "Address|Reference(Location)",
4221          "The physical location of the accident event.", 0, 1, location));
4222    }
4223
4224    @Override
4225    public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
4226      switch (_hash) {
4227      case 3076014:
4228        /* date */ return new Property("date", "date",
4229            "Date of an accident event  related to the products and services contained in the claim.", 0, 1, date);
4230      case 3575610:
4231        /* type */ return new Property("type", "CodeableConcept",
4232            "The type or context of the accident event for the purposes of selection of potential insurance coverages and determination of coordination between insurers.",
4233            0, 1, type);
4234      case 552316075:
4235        /* location[x] */ return new Property("location[x]", "Address|Reference(Location)",
4236            "The physical location of the accident event.", 0, 1, location);
4237      case 1901043637:
4238        /* location */ return new Property("location[x]", "Address|Reference(Location)",
4239            "The physical location of the accident event.", 0, 1, location);
4240      case -1280020865:
4241        /* locationAddress */ return new Property("location[x]", "Address|Reference(Location)",
4242            "The physical location of the accident event.", 0, 1, location);
4243      case 755866390:
4244        /* locationReference */ return new Property("location[x]", "Address|Reference(Location)",
4245            "The physical location of the accident event.", 0, 1, location);
4246      default:
4247        return super.getNamedProperty(_hash, _name, _checkValid);
4248      }
4249
4250    }
4251
4252    @Override
4253    public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
4254      switch (hash) {
4255      case 3076014:
4256        /* date */ return this.date == null ? new Base[0] : new Base[] { this.date }; // DateType
4257      case 3575610:
4258        /* type */ return this.type == null ? new Base[0] : new Base[] { this.type }; // CodeableConcept
4259      case 1901043637:
4260        /* location */ return this.location == null ? new Base[0] : new Base[] { this.location }; // Type
4261      default:
4262        return super.getProperty(hash, name, checkValid);
4263      }
4264
4265    }
4266
4267    @Override
4268    public Base setProperty(int hash, String name, Base value) throws FHIRException {
4269      switch (hash) {
4270      case 3076014: // date
4271        this.date = castToDate(value); // DateType
4272        return value;
4273      case 3575610: // type
4274        this.type = castToCodeableConcept(value); // CodeableConcept
4275        return value;
4276      case 1901043637: // location
4277        this.location = castToType(value); // Type
4278        return value;
4279      default:
4280        return super.setProperty(hash, name, value);
4281      }
4282
4283    }
4284
4285    @Override
4286    public Base setProperty(String name, Base value) throws FHIRException {
4287      if (name.equals("date")) {
4288        this.date = castToDate(value); // DateType
4289      } else if (name.equals("type")) {
4290        this.type = castToCodeableConcept(value); // CodeableConcept
4291      } else if (name.equals("location[x]")) {
4292        this.location = castToType(value); // Type
4293      } else
4294        return super.setProperty(name, value);
4295      return value;
4296    }
4297
4298  @Override
4299  public void removeChild(String name, Base value) throws FHIRException {
4300      if (name.equals("date")) {
4301        this.date = null;
4302      } else if (name.equals("type")) {
4303        this.type = null;
4304      } else if (name.equals("location[x]")) {
4305        this.location = null;
4306      } else
4307        super.removeChild(name, value);
4308      
4309    }
4310
4311    @Override
4312    public Base makeProperty(int hash, String name) throws FHIRException {
4313      switch (hash) {
4314      case 3076014:
4315        return getDateElement();
4316      case 3575610:
4317        return getType();
4318      case 552316075:
4319        return getLocation();
4320      case 1901043637:
4321        return getLocation();
4322      default:
4323        return super.makeProperty(hash, name);
4324      }
4325
4326    }
4327
4328    @Override
4329    public String[] getTypesForProperty(int hash, String name) throws FHIRException {
4330      switch (hash) {
4331      case 3076014:
4332        /* date */ return new String[] { "date" };
4333      case 3575610:
4334        /* type */ return new String[] { "CodeableConcept" };
4335      case 1901043637:
4336        /* location */ return new String[] { "Address", "Reference" };
4337      default:
4338        return super.getTypesForProperty(hash, name);
4339      }
4340
4341    }
4342
4343    @Override
4344    public Base addChild(String name) throws FHIRException {
4345      if (name.equals("date")) {
4346        throw new FHIRException("Cannot call addChild on a singleton property Claim.date");
4347      } else if (name.equals("type")) {
4348        this.type = new CodeableConcept();
4349        return this.type;
4350      } else if (name.equals("locationAddress")) {
4351        this.location = new Address();
4352        return this.location;
4353      } else if (name.equals("locationReference")) {
4354        this.location = new Reference();
4355        return this.location;
4356      } else
4357        return super.addChild(name);
4358    }
4359
4360    public AccidentComponent copy() {
4361      AccidentComponent dst = new AccidentComponent();
4362      copyValues(dst);
4363      return dst;
4364    }
4365
4366    public void copyValues(AccidentComponent dst) {
4367      super.copyValues(dst);
4368      dst.date = date == null ? null : date.copy();
4369      dst.type = type == null ? null : type.copy();
4370      dst.location = location == null ? null : location.copy();
4371    }
4372
4373    @Override
4374    public boolean equalsDeep(Base other_) {
4375      if (!super.equalsDeep(other_))
4376        return false;
4377      if (!(other_ instanceof AccidentComponent))
4378        return false;
4379      AccidentComponent o = (AccidentComponent) other_;
4380      return compareDeep(date, o.date, true) && compareDeep(type, o.type, true)
4381          && compareDeep(location, o.location, true);
4382    }
4383
4384    @Override
4385    public boolean equalsShallow(Base other_) {
4386      if (!super.equalsShallow(other_))
4387        return false;
4388      if (!(other_ instanceof AccidentComponent))
4389        return false;
4390      AccidentComponent o = (AccidentComponent) other_;
4391      return compareValues(date, o.date, true);
4392    }
4393
4394    public boolean isEmpty() {
4395      return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(date, type, location);
4396    }
4397
4398    public String fhirType() {
4399      return "Claim.accident";
4400
4401    }
4402
4403  }
4404
4405  @Block()
4406  public static class ItemComponent extends BackboneElement implements IBaseBackboneElement {
4407    /**
4408     * A number to uniquely identify item entries.
4409     */
4410    @Child(name = "sequence", type = {
4411        PositiveIntType.class }, order = 1, min = 1, max = 1, modifier = false, summary = false)
4412    @Description(shortDefinition = "Item instance identifier", formalDefinition = "A number to uniquely identify item entries.")
4413    protected PositiveIntType sequence;
4414
4415    /**
4416     * CareTeam members related to this service or product.
4417     */
4418    @Child(name = "careTeamSequence", type = {
4419        PositiveIntType.class }, order = 2, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
4420    @Description(shortDefinition = "Applicable careTeam members", formalDefinition = "CareTeam members related to this service or product.")
4421    protected List<PositiveIntType> careTeamSequence;
4422
4423    /**
4424     * Diagnosis applicable for this service or product.
4425     */
4426    @Child(name = "diagnosisSequence", type = {
4427        PositiveIntType.class }, order = 3, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
4428    @Description(shortDefinition = "Applicable diagnoses", formalDefinition = "Diagnosis applicable for this service or product.")
4429    protected List<PositiveIntType> diagnosisSequence;
4430
4431    /**
4432     * Procedures applicable for this service or product.
4433     */
4434    @Child(name = "procedureSequence", type = {
4435        PositiveIntType.class }, order = 4, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
4436    @Description(shortDefinition = "Applicable procedures", formalDefinition = "Procedures applicable for this service or product.")
4437    protected List<PositiveIntType> procedureSequence;
4438
4439    /**
4440     * Exceptions, special conditions and supporting information applicable for this
4441     * service or product.
4442     */
4443    @Child(name = "informationSequence", type = {
4444        PositiveIntType.class }, order = 5, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
4445    @Description(shortDefinition = "Applicable exception and supporting information", formalDefinition = "Exceptions, special conditions and supporting information applicable for this service or product.")
4446    protected List<PositiveIntType> informationSequence;
4447
4448    /**
4449     * The type of revenue or cost center providing the product and/or service.
4450     */
4451    @Child(name = "revenue", type = {
4452        CodeableConcept.class }, order = 6, min = 0, max = 1, modifier = false, summary = false)
4453    @Description(shortDefinition = "Revenue or cost center code", formalDefinition = "The type of revenue or cost center providing the product and/or service.")
4454    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/ex-revenue-center")
4455    protected CodeableConcept revenue;
4456
4457    /**
4458     * Code to identify the general type of benefits under which products and
4459     * services are provided.
4460     */
4461    @Child(name = "category", type = {
4462        CodeableConcept.class }, order = 7, min = 0, max = 1, modifier = false, summary = false)
4463    @Description(shortDefinition = "Benefit classification", formalDefinition = "Code to identify the general type of benefits under which products and services are provided.")
4464    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/ex-benefitcategory")
4465    protected CodeableConcept category;
4466
4467    /**
4468     * When the value is a group code then this item collects a set of related claim
4469     * details, otherwise this contains the product, service, drug or other billing
4470     * code for the item.
4471     */
4472    @Child(name = "productOrService", type = {
4473        CodeableConcept.class }, order = 8, min = 1, max = 1, modifier = false, summary = false)
4474    @Description(shortDefinition = "Billing, service, product, or drug code", formalDefinition = "When the value is a group code then this item collects a set of related claim details, otherwise this contains the product, service, drug or other billing code for the item.")
4475    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/service-uscls")
4476    protected CodeableConcept productOrService;
4477
4478    /**
4479     * Item typification or modifiers codes to convey additional context for the
4480     * product or service.
4481     */
4482    @Child(name = "modifier", type = {
4483        CodeableConcept.class }, order = 9, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
4484    @Description(shortDefinition = "Product or service billing modifiers", formalDefinition = "Item typification or modifiers codes to convey additional context for the product or service.")
4485    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/claim-modifiers")
4486    protected List<CodeableConcept> modifier;
4487
4488    /**
4489     * Identifies the program under which this may be recovered.
4490     */
4491    @Child(name = "programCode", type = {
4492        CodeableConcept.class }, order = 10, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
4493    @Description(shortDefinition = "Program the product or service is provided under", formalDefinition = "Identifies the program under which this may be recovered.")
4494    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/ex-program-code")
4495    protected List<CodeableConcept> programCode;
4496
4497    /**
4498     * The date or dates when the service or product was supplied, performed or
4499     * completed.
4500     */
4501    @Child(name = "serviced", type = { DateType.class,
4502        Period.class }, order = 11, min = 0, max = 1, modifier = false, summary = false)
4503    @Description(shortDefinition = "Date or dates of service or product delivery", formalDefinition = "The date or dates when the service or product was supplied, performed or completed.")
4504    protected Type serviced;
4505
4506    /**
4507     * Where the product or service was provided.
4508     */
4509    @Child(name = "location", type = { CodeableConcept.class, Address.class,
4510        Location.class }, order = 12, min = 0, max = 1, modifier = false, summary = false)
4511    @Description(shortDefinition = "Place of service or where product was supplied", formalDefinition = "Where the product or service was provided.")
4512    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/service-place")
4513    protected Type location;
4514
4515    /**
4516     * The number of repetitions of a service or product.
4517     */
4518    @Child(name = "quantity", type = {
4519        Quantity.class }, order = 13, min = 0, max = 1, modifier = false, summary = false)
4520    @Description(shortDefinition = "Count of products or services", formalDefinition = "The number of repetitions of a service or product.")
4521    protected Quantity quantity;
4522
4523    /**
4524     * If the item is not a group then this is the fee for the product or service,
4525     * otherwise this is the total of the fees for the details of the group.
4526     */
4527    @Child(name = "unitPrice", type = { Money.class }, order = 14, min = 0, max = 1, modifier = false, summary = false)
4528    @Description(shortDefinition = "Fee, charge or cost per item", formalDefinition = "If the item is not a group then this is the fee for the product or service, otherwise this is the total of the fees for the details of the group.")
4529    protected Money unitPrice;
4530
4531    /**
4532     * A real number that represents a multiplier used in determining the overall
4533     * value of services delivered and/or goods received. The concept of a Factor
4534     * allows for a discount or surcharge multiplier to be applied to a monetary
4535     * amount.
4536     */
4537    @Child(name = "factor", type = {
4538        DecimalType.class }, order = 15, min = 0, max = 1, modifier = false, summary = false)
4539    @Description(shortDefinition = "Price scaling factor", formalDefinition = "A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.")
4540    protected DecimalType factor;
4541
4542    /**
4543     * The quantity times the unit price for an additional service or product or
4544     * charge.
4545     */
4546    @Child(name = "net", type = { Money.class }, order = 16, min = 0, max = 1, modifier = false, summary = false)
4547    @Description(shortDefinition = "Total item cost", formalDefinition = "The quantity times the unit price for an additional service or product or charge.")
4548    protected Money net;
4549
4550    /**
4551     * Unique Device Identifiers associated with this line item.
4552     */
4553    @Child(name = "udi", type = {
4554        Device.class }, order = 17, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
4555    @Description(shortDefinition = "Unique device identifier", formalDefinition = "Unique Device Identifiers associated with this line item.")
4556    protected List<Reference> udi;
4557    /**
4558     * The actual objects that are the target of the reference (Unique Device
4559     * Identifiers associated with this line item.)
4560     */
4561    protected List<Device> udiTarget;
4562
4563    /**
4564     * Physical service site on the patient (limb, tooth, etc.).
4565     */
4566    @Child(name = "bodySite", type = {
4567        CodeableConcept.class }, order = 18, min = 0, max = 1, modifier = false, summary = false)
4568    @Description(shortDefinition = "Anatomical location", formalDefinition = "Physical service site on the patient (limb, tooth, etc.).")
4569    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/tooth")
4570    protected CodeableConcept bodySite;
4571
4572    /**
4573     * A region or surface of the bodySite, e.g. limb region or tooth surface(s).
4574     */
4575    @Child(name = "subSite", type = {
4576        CodeableConcept.class }, order = 19, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
4577    @Description(shortDefinition = "Anatomical sub-location", formalDefinition = "A region or surface of the bodySite, e.g. limb region or tooth surface(s).")
4578    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/surface")
4579    protected List<CodeableConcept> subSite;
4580
4581    /**
4582     * The Encounters during which this Claim was created or to which the creation
4583     * of this record is tightly associated.
4584     */
4585    @Child(name = "encounter", type = {
4586        Encounter.class }, order = 20, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
4587    @Description(shortDefinition = "Encounters related to this billed item", formalDefinition = "The Encounters during which this Claim was created or to which the creation of this record is tightly associated.")
4588    protected List<Reference> encounter;
4589    /**
4590     * The actual objects that are the target of the reference (The Encounters
4591     * during which this Claim was created or to which the creation of this record
4592     * is tightly associated.)
4593     */
4594    protected List<Encounter> encounterTarget;
4595
4596    /**
4597     * A claim detail line. Either a simple (a product or service) or a 'group' of
4598     * sub-details which are simple items.
4599     */
4600    @Child(name = "detail", type = {}, order = 21, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
4601    @Description(shortDefinition = "Product or service provided", formalDefinition = "A claim detail line. Either a simple (a product or service) or a 'group' of sub-details which are simple items.")
4602    protected List<DetailComponent> detail;
4603
4604    private static final long serialVersionUID = -329028323L;
4605
4606    /**
4607     * Constructor
4608     */
4609    public ItemComponent() {
4610      super();
4611    }
4612
4613    /**
4614     * Constructor
4615     */
4616    public ItemComponent(PositiveIntType sequence, CodeableConcept productOrService) {
4617      super();
4618      this.sequence = sequence;
4619      this.productOrService = productOrService;
4620    }
4621
4622    /**
4623     * @return {@link #sequence} (A number to uniquely identify item entries.). This
4624     *         is the underlying object with id, value and extensions. The accessor
4625     *         "getSequence" gives direct access to the value
4626     */
4627    public PositiveIntType getSequenceElement() {
4628      if (this.sequence == null)
4629        if (Configuration.errorOnAutoCreate())
4630          throw new Error("Attempt to auto-create ItemComponent.sequence");
4631        else if (Configuration.doAutoCreate())
4632          this.sequence = new PositiveIntType(); // bb
4633      return this.sequence;
4634    }
4635
4636    public boolean hasSequenceElement() {
4637      return this.sequence != null && !this.sequence.isEmpty();
4638    }
4639
4640    public boolean hasSequence() {
4641      return this.sequence != null && !this.sequence.isEmpty();
4642    }
4643
4644    /**
4645     * @param value {@link #sequence} (A number to uniquely identify item entries.).
4646     *              This is the underlying object with id, value and extensions. The
4647     *              accessor "getSequence" gives direct access to the value
4648     */
4649    public ItemComponent setSequenceElement(PositiveIntType value) {
4650      this.sequence = value;
4651      return this;
4652    }
4653
4654    /**
4655     * @return A number to uniquely identify item entries.
4656     */
4657    public int getSequence() {
4658      return this.sequence == null || this.sequence.isEmpty() ? 0 : this.sequence.getValue();
4659    }
4660
4661    /**
4662     * @param value A number to uniquely identify item entries.
4663     */
4664    public ItemComponent setSequence(int value) {
4665      if (this.sequence == null)
4666        this.sequence = new PositiveIntType();
4667      this.sequence.setValue(value);
4668      return this;
4669    }
4670
4671    /**
4672     * @return {@link #careTeamSequence} (CareTeam members related to this service
4673     *         or product.)
4674     */
4675    public List<PositiveIntType> getCareTeamSequence() {
4676      if (this.careTeamSequence == null)
4677        this.careTeamSequence = new ArrayList<PositiveIntType>();
4678      return this.careTeamSequence;
4679    }
4680
4681    /**
4682     * @return Returns a reference to <code>this</code> for easy method chaining
4683     */
4684    public ItemComponent setCareTeamSequence(List<PositiveIntType> theCareTeamSequence) {
4685      this.careTeamSequence = theCareTeamSequence;
4686      return this;
4687    }
4688
4689    public boolean hasCareTeamSequence() {
4690      if (this.careTeamSequence == null)
4691        return false;
4692      for (PositiveIntType item : this.careTeamSequence)
4693        if (!item.isEmpty())
4694          return true;
4695      return false;
4696    }
4697
4698    /**
4699     * @return {@link #careTeamSequence} (CareTeam members related to this service
4700     *         or product.)
4701     */
4702    public PositiveIntType addCareTeamSequenceElement() {// 2
4703      PositiveIntType t = new PositiveIntType();
4704      if (this.careTeamSequence == null)
4705        this.careTeamSequence = new ArrayList<PositiveIntType>();
4706      this.careTeamSequence.add(t);
4707      return t;
4708    }
4709
4710    /**
4711     * @param value {@link #careTeamSequence} (CareTeam members related to this
4712     *              service or product.)
4713     */
4714    public ItemComponent addCareTeamSequence(int value) { // 1
4715      PositiveIntType t = new PositiveIntType();
4716      t.setValue(value);
4717      if (this.careTeamSequence == null)
4718        this.careTeamSequence = new ArrayList<PositiveIntType>();
4719      this.careTeamSequence.add(t);
4720      return this;
4721    }
4722
4723    /**
4724     * @param value {@link #careTeamSequence} (CareTeam members related to this
4725     *              service or product.)
4726     */
4727    public boolean hasCareTeamSequence(int value) {
4728      if (this.careTeamSequence == null)
4729        return false;
4730      for (PositiveIntType v : this.careTeamSequence)
4731        if (v.getValue().equals(value)) // positiveInt
4732          return true;
4733      return false;
4734    }
4735
4736    /**
4737     * @return {@link #diagnosisSequence} (Diagnosis applicable for this service or
4738     *         product.)
4739     */
4740    public List<PositiveIntType> getDiagnosisSequence() {
4741      if (this.diagnosisSequence == null)
4742        this.diagnosisSequence = new ArrayList<PositiveIntType>();
4743      return this.diagnosisSequence;
4744    }
4745
4746    /**
4747     * @return Returns a reference to <code>this</code> for easy method chaining
4748     */
4749    public ItemComponent setDiagnosisSequence(List<PositiveIntType> theDiagnosisSequence) {
4750      this.diagnosisSequence = theDiagnosisSequence;
4751      return this;
4752    }
4753
4754    public boolean hasDiagnosisSequence() {
4755      if (this.diagnosisSequence == null)
4756        return false;
4757      for (PositiveIntType item : this.diagnosisSequence)
4758        if (!item.isEmpty())
4759          return true;
4760      return false;
4761    }
4762
4763    /**
4764     * @return {@link #diagnosisSequence} (Diagnosis applicable for this service or
4765     *         product.)
4766     */
4767    public PositiveIntType addDiagnosisSequenceElement() {// 2
4768      PositiveIntType t = new PositiveIntType();
4769      if (this.diagnosisSequence == null)
4770        this.diagnosisSequence = new ArrayList<PositiveIntType>();
4771      this.diagnosisSequence.add(t);
4772      return t;
4773    }
4774
4775    /**
4776     * @param value {@link #diagnosisSequence} (Diagnosis applicable for this
4777     *              service or product.)
4778     */
4779    public ItemComponent addDiagnosisSequence(int value) { // 1
4780      PositiveIntType t = new PositiveIntType();
4781      t.setValue(value);
4782      if (this.diagnosisSequence == null)
4783        this.diagnosisSequence = new ArrayList<PositiveIntType>();
4784      this.diagnosisSequence.add(t);
4785      return this;
4786    }
4787
4788    /**
4789     * @param value {@link #diagnosisSequence} (Diagnosis applicable for this
4790     *              service or product.)
4791     */
4792    public boolean hasDiagnosisSequence(int value) {
4793      if (this.diagnosisSequence == null)
4794        return false;
4795      for (PositiveIntType v : this.diagnosisSequence)
4796        if (v.getValue().equals(value)) // positiveInt
4797          return true;
4798      return false;
4799    }
4800
4801    /**
4802     * @return {@link #procedureSequence} (Procedures applicable for this service or
4803     *         product.)
4804     */
4805    public List<PositiveIntType> getProcedureSequence() {
4806      if (this.procedureSequence == null)
4807        this.procedureSequence = new ArrayList<PositiveIntType>();
4808      return this.procedureSequence;
4809    }
4810
4811    /**
4812     * @return Returns a reference to <code>this</code> for easy method chaining
4813     */
4814    public ItemComponent setProcedureSequence(List<PositiveIntType> theProcedureSequence) {
4815      this.procedureSequence = theProcedureSequence;
4816      return this;
4817    }
4818
4819    public boolean hasProcedureSequence() {
4820      if (this.procedureSequence == null)
4821        return false;
4822      for (PositiveIntType item : this.procedureSequence)
4823        if (!item.isEmpty())
4824          return true;
4825      return false;
4826    }
4827
4828    /**
4829     * @return {@link #procedureSequence} (Procedures applicable for this service or
4830     *         product.)
4831     */
4832    public PositiveIntType addProcedureSequenceElement() {// 2
4833      PositiveIntType t = new PositiveIntType();
4834      if (this.procedureSequence == null)
4835        this.procedureSequence = new ArrayList<PositiveIntType>();
4836      this.procedureSequence.add(t);
4837      return t;
4838    }
4839
4840    /**
4841     * @param value {@link #procedureSequence} (Procedures applicable for this
4842     *              service or product.)
4843     */
4844    public ItemComponent addProcedureSequence(int value) { // 1
4845      PositiveIntType t = new PositiveIntType();
4846      t.setValue(value);
4847      if (this.procedureSequence == null)
4848        this.procedureSequence = new ArrayList<PositiveIntType>();
4849      this.procedureSequence.add(t);
4850      return this;
4851    }
4852
4853    /**
4854     * @param value {@link #procedureSequence} (Procedures applicable for this
4855     *              service or product.)
4856     */
4857    public boolean hasProcedureSequence(int value) {
4858      if (this.procedureSequence == null)
4859        return false;
4860      for (PositiveIntType v : this.procedureSequence)
4861        if (v.getValue().equals(value)) // positiveInt
4862          return true;
4863      return false;
4864    }
4865
4866    /**
4867     * @return {@link #informationSequence} (Exceptions, special conditions and
4868     *         supporting information applicable for this service or product.)
4869     */
4870    public List<PositiveIntType> getInformationSequence() {
4871      if (this.informationSequence == null)
4872        this.informationSequence = new ArrayList<PositiveIntType>();
4873      return this.informationSequence;
4874    }
4875
4876    /**
4877     * @return Returns a reference to <code>this</code> for easy method chaining
4878     */
4879    public ItemComponent setInformationSequence(List<PositiveIntType> theInformationSequence) {
4880      this.informationSequence = theInformationSequence;
4881      return this;
4882    }
4883
4884    public boolean hasInformationSequence() {
4885      if (this.informationSequence == null)
4886        return false;
4887      for (PositiveIntType item : this.informationSequence)
4888        if (!item.isEmpty())
4889          return true;
4890      return false;
4891    }
4892
4893    /**
4894     * @return {@link #informationSequence} (Exceptions, special conditions and
4895     *         supporting information applicable for this service or product.)
4896     */
4897    public PositiveIntType addInformationSequenceElement() {// 2
4898      PositiveIntType t = new PositiveIntType();
4899      if (this.informationSequence == null)
4900        this.informationSequence = new ArrayList<PositiveIntType>();
4901      this.informationSequence.add(t);
4902      return t;
4903    }
4904
4905    /**
4906     * @param value {@link #informationSequence} (Exceptions, special conditions and
4907     *              supporting information applicable for this service or product.)
4908     */
4909    public ItemComponent addInformationSequence(int value) { // 1
4910      PositiveIntType t = new PositiveIntType();
4911      t.setValue(value);
4912      if (this.informationSequence == null)
4913        this.informationSequence = new ArrayList<PositiveIntType>();
4914      this.informationSequence.add(t);
4915      return this;
4916    }
4917
4918    /**
4919     * @param value {@link #informationSequence} (Exceptions, special conditions and
4920     *              supporting information applicable for this service or product.)
4921     */
4922    public boolean hasInformationSequence(int value) {
4923      if (this.informationSequence == null)
4924        return false;
4925      for (PositiveIntType v : this.informationSequence)
4926        if (v.getValue().equals(value)) // positiveInt
4927          return true;
4928      return false;
4929    }
4930
4931    /**
4932     * @return {@link #revenue} (The type of revenue or cost center providing the
4933     *         product and/or service.)
4934     */
4935    public CodeableConcept getRevenue() {
4936      if (this.revenue == null)
4937        if (Configuration.errorOnAutoCreate())
4938          throw new Error("Attempt to auto-create ItemComponent.revenue");
4939        else if (Configuration.doAutoCreate())
4940          this.revenue = new CodeableConcept(); // cc
4941      return this.revenue;
4942    }
4943
4944    public boolean hasRevenue() {
4945      return this.revenue != null && !this.revenue.isEmpty();
4946    }
4947
4948    /**
4949     * @param value {@link #revenue} (The type of revenue or cost center providing
4950     *              the product and/or service.)
4951     */
4952    public ItemComponent setRevenue(CodeableConcept value) {
4953      this.revenue = value;
4954      return this;
4955    }
4956
4957    /**
4958     * @return {@link #category} (Code to identify the general type of benefits
4959     *         under which products and services are provided.)
4960     */
4961    public CodeableConcept getCategory() {
4962      if (this.category == null)
4963        if (Configuration.errorOnAutoCreate())
4964          throw new Error("Attempt to auto-create ItemComponent.category");
4965        else if (Configuration.doAutoCreate())
4966          this.category = new CodeableConcept(); // cc
4967      return this.category;
4968    }
4969
4970    public boolean hasCategory() {
4971      return this.category != null && !this.category.isEmpty();
4972    }
4973
4974    /**
4975     * @param value {@link #category} (Code to identify the general type of benefits
4976     *              under which products and services are provided.)
4977     */
4978    public ItemComponent setCategory(CodeableConcept value) {
4979      this.category = value;
4980      return this;
4981    }
4982
4983    /**
4984     * @return {@link #productOrService} (When the value is a group code then this
4985     *         item collects a set of related claim details, otherwise this contains
4986     *         the product, service, drug or other billing code for the item.)
4987     */
4988    public CodeableConcept getProductOrService() {
4989      if (this.productOrService == null)
4990        if (Configuration.errorOnAutoCreate())
4991          throw new Error("Attempt to auto-create ItemComponent.productOrService");
4992        else if (Configuration.doAutoCreate())
4993          this.productOrService = new CodeableConcept(); // cc
4994      return this.productOrService;
4995    }
4996
4997    public boolean hasProductOrService() {
4998      return this.productOrService != null && !this.productOrService.isEmpty();
4999    }
5000
5001    /**
5002     * @param value {@link #productOrService} (When the value is a group code then
5003     *              this item collects a set of related claim details, otherwise
5004     *              this contains the product, service, drug or other billing code
5005     *              for the item.)
5006     */
5007    public ItemComponent setProductOrService(CodeableConcept value) {
5008      this.productOrService = value;
5009      return this;
5010    }
5011
5012    /**
5013     * @return {@link #modifier} (Item typification or modifiers codes to convey
5014     *         additional context for the product or service.)
5015     */
5016    public List<CodeableConcept> getModifier() {
5017      if (this.modifier == null)
5018        this.modifier = new ArrayList<CodeableConcept>();
5019      return this.modifier;
5020    }
5021
5022    /**
5023     * @return Returns a reference to <code>this</code> for easy method chaining
5024     */
5025    public ItemComponent setModifier(List<CodeableConcept> theModifier) {
5026      this.modifier = theModifier;
5027      return this;
5028    }
5029
5030    public boolean hasModifier() {
5031      if (this.modifier == null)
5032        return false;
5033      for (CodeableConcept item : this.modifier)
5034        if (!item.isEmpty())
5035          return true;
5036      return false;
5037    }
5038
5039    public CodeableConcept addModifier() { // 3
5040      CodeableConcept t = new CodeableConcept();
5041      if (this.modifier == null)
5042        this.modifier = new ArrayList<CodeableConcept>();
5043      this.modifier.add(t);
5044      return t;
5045    }
5046
5047    public ItemComponent addModifier(CodeableConcept t) { // 3
5048      if (t == null)
5049        return this;
5050      if (this.modifier == null)
5051        this.modifier = new ArrayList<CodeableConcept>();
5052      this.modifier.add(t);
5053      return this;
5054    }
5055
5056    /**
5057     * @return The first repetition of repeating field {@link #modifier}, creating
5058     *         it if it does not already exist
5059     */
5060    public CodeableConcept getModifierFirstRep() {
5061      if (getModifier().isEmpty()) {
5062        addModifier();
5063      }
5064      return getModifier().get(0);
5065    }
5066
5067    /**
5068     * @return {@link #programCode} (Identifies the program under which this may be
5069     *         recovered.)
5070     */
5071    public List<CodeableConcept> getProgramCode() {
5072      if (this.programCode == null)
5073        this.programCode = new ArrayList<CodeableConcept>();
5074      return this.programCode;
5075    }
5076
5077    /**
5078     * @return Returns a reference to <code>this</code> for easy method chaining
5079     */
5080    public ItemComponent setProgramCode(List<CodeableConcept> theProgramCode) {
5081      this.programCode = theProgramCode;
5082      return this;
5083    }
5084
5085    public boolean hasProgramCode() {
5086      if (this.programCode == null)
5087        return false;
5088      for (CodeableConcept item : this.programCode)
5089        if (!item.isEmpty())
5090          return true;
5091      return false;
5092    }
5093
5094    public CodeableConcept addProgramCode() { // 3
5095      CodeableConcept t = new CodeableConcept();
5096      if (this.programCode == null)
5097        this.programCode = new ArrayList<CodeableConcept>();
5098      this.programCode.add(t);
5099      return t;
5100    }
5101
5102    public ItemComponent addProgramCode(CodeableConcept t) { // 3
5103      if (t == null)
5104        return this;
5105      if (this.programCode == null)
5106        this.programCode = new ArrayList<CodeableConcept>();
5107      this.programCode.add(t);
5108      return this;
5109    }
5110
5111    /**
5112     * @return The first repetition of repeating field {@link #programCode},
5113     *         creating it if it does not already exist
5114     */
5115    public CodeableConcept getProgramCodeFirstRep() {
5116      if (getProgramCode().isEmpty()) {
5117        addProgramCode();
5118      }
5119      return getProgramCode().get(0);
5120    }
5121
5122    /**
5123     * @return {@link #serviced} (The date or dates when the service or product was
5124     *         supplied, performed or completed.)
5125     */
5126    public Type getServiced() {
5127      return this.serviced;
5128    }
5129
5130    /**
5131     * @return {@link #serviced} (The date or dates when the service or product was
5132     *         supplied, performed or completed.)
5133     */
5134    public DateType getServicedDateType() throws FHIRException {
5135      if (this.serviced == null)
5136        this.serviced = new DateType();
5137      if (!(this.serviced instanceof DateType))
5138        throw new FHIRException("Type mismatch: the type DateType was expected, but "
5139            + this.serviced.getClass().getName() + " was encountered");
5140      return (DateType) this.serviced;
5141    }
5142
5143    public boolean hasServicedDateType() {
5144      return this != null && this.serviced instanceof DateType;
5145    }
5146
5147    /**
5148     * @return {@link #serviced} (The date or dates when the service or product was
5149     *         supplied, performed or completed.)
5150     */
5151    public Period getServicedPeriod() throws FHIRException {
5152      if (this.serviced == null)
5153        this.serviced = new Period();
5154      if (!(this.serviced instanceof Period))
5155        throw new FHIRException("Type mismatch: the type Period was expected, but " + this.serviced.getClass().getName()
5156            + " was encountered");
5157      return (Period) this.serviced;
5158    }
5159
5160    public boolean hasServicedPeriod() {
5161      return this != null && this.serviced instanceof Period;
5162    }
5163
5164    public boolean hasServiced() {
5165      return this.serviced != null && !this.serviced.isEmpty();
5166    }
5167
5168    /**
5169     * @param value {@link #serviced} (The date or dates when the service or product
5170     *              was supplied, performed or completed.)
5171     */
5172    public ItemComponent setServiced(Type value) {
5173      if (value != null && !(value instanceof DateType || value instanceof Period))
5174        throw new Error("Not the right type for Claim.item.serviced[x]: " + value.fhirType());
5175      this.serviced = value;
5176      return this;
5177    }
5178
5179    /**
5180     * @return {@link #location} (Where the product or service was provided.)
5181     */
5182    public Type getLocation() {
5183      return this.location;
5184    }
5185
5186    /**
5187     * @return {@link #location} (Where the product or service was provided.)
5188     */
5189    public CodeableConcept getLocationCodeableConcept() throws FHIRException {
5190      if (this.location == null)
5191        this.location = new CodeableConcept();
5192      if (!(this.location instanceof CodeableConcept))
5193        throw new FHIRException("Type mismatch: the type CodeableConcept was expected, but "
5194            + this.location.getClass().getName() + " was encountered");
5195      return (CodeableConcept) this.location;
5196    }
5197
5198    public boolean hasLocationCodeableConcept() {
5199      return this != null && this.location instanceof CodeableConcept;
5200    }
5201
5202    /**
5203     * @return {@link #location} (Where the product or service was provided.)
5204     */
5205    public Address getLocationAddress() throws FHIRException {
5206      if (this.location == null)
5207        this.location = new Address();
5208      if (!(this.location instanceof Address))
5209        throw new FHIRException("Type mismatch: the type Address was expected, but "
5210            + this.location.getClass().getName() + " was encountered");
5211      return (Address) this.location;
5212    }
5213
5214    public boolean hasLocationAddress() {
5215      return this != null && this.location instanceof Address;
5216    }
5217
5218    /**
5219     * @return {@link #location} (Where the product or service was provided.)
5220     */
5221    public Reference getLocationReference() throws FHIRException {
5222      if (this.location == null)
5223        this.location = new Reference();
5224      if (!(this.location instanceof Reference))
5225        throw new FHIRException("Type mismatch: the type Reference was expected, but "
5226            + this.location.getClass().getName() + " was encountered");
5227      return (Reference) this.location;
5228    }
5229
5230    public boolean hasLocationReference() {
5231      return this != null && this.location instanceof Reference;
5232    }
5233
5234    public boolean hasLocation() {
5235      return this.location != null && !this.location.isEmpty();
5236    }
5237
5238    /**
5239     * @param value {@link #location} (Where the product or service was provided.)
5240     */
5241    public ItemComponent setLocation(Type value) {
5242      if (value != null
5243          && !(value instanceof CodeableConcept || value instanceof Address || value instanceof Reference))
5244        throw new Error("Not the right type for Claim.item.location[x]: " + value.fhirType());
5245      this.location = value;
5246      return this;
5247    }
5248
5249    /**
5250     * @return {@link #quantity} (The number of repetitions of a service or
5251     *         product.)
5252     */
5253    public Quantity getQuantity() {
5254      if (this.quantity == null)
5255        if (Configuration.errorOnAutoCreate())
5256          throw new Error("Attempt to auto-create ItemComponent.quantity");
5257        else if (Configuration.doAutoCreate())
5258          this.quantity = new Quantity(); // cc
5259      return this.quantity;
5260    }
5261
5262    public boolean hasQuantity() {
5263      return this.quantity != null && !this.quantity.isEmpty();
5264    }
5265
5266    /**
5267     * @param value {@link #quantity} (The number of repetitions of a service or
5268     *              product.)
5269     */
5270    public ItemComponent setQuantity(Quantity value) {
5271      this.quantity = value;
5272      return this;
5273    }
5274
5275    /**
5276     * @return {@link #unitPrice} (If the item is not a group then this is the fee
5277     *         for the product or service, otherwise this is the total of the fees
5278     *         for the details of the group.)
5279     */
5280    public Money getUnitPrice() {
5281      if (this.unitPrice == null)
5282        if (Configuration.errorOnAutoCreate())
5283          throw new Error("Attempt to auto-create ItemComponent.unitPrice");
5284        else if (Configuration.doAutoCreate())
5285          this.unitPrice = new Money(); // cc
5286      return this.unitPrice;
5287    }
5288
5289    public boolean hasUnitPrice() {
5290      return this.unitPrice != null && !this.unitPrice.isEmpty();
5291    }
5292
5293    /**
5294     * @param value {@link #unitPrice} (If the item is not a group then this is the
5295     *              fee for the product or service, otherwise this is the total of
5296     *              the fees for the details of the group.)
5297     */
5298    public ItemComponent setUnitPrice(Money value) {
5299      this.unitPrice = value;
5300      return this;
5301    }
5302
5303    /**
5304     * @return {@link #factor} (A real number that represents a multiplier used in
5305     *         determining the overall value of services delivered and/or goods
5306     *         received. The concept of a Factor allows for a discount or surcharge
5307     *         multiplier to be applied to a monetary amount.). This is the
5308     *         underlying object with id, value and extensions. The accessor
5309     *         "getFactor" gives direct access to the value
5310     */
5311    public DecimalType getFactorElement() {
5312      if (this.factor == null)
5313        if (Configuration.errorOnAutoCreate())
5314          throw new Error("Attempt to auto-create ItemComponent.factor");
5315        else if (Configuration.doAutoCreate())
5316          this.factor = new DecimalType(); // bb
5317      return this.factor;
5318    }
5319
5320    public boolean hasFactorElement() {
5321      return this.factor != null && !this.factor.isEmpty();
5322    }
5323
5324    public boolean hasFactor() {
5325      return this.factor != null && !this.factor.isEmpty();
5326    }
5327
5328    /**
5329     * @param value {@link #factor} (A real number that represents a multiplier used
5330     *              in determining the overall value of services delivered and/or
5331     *              goods received. The concept of a Factor allows for a discount or
5332     *              surcharge multiplier to be applied to a monetary amount.). This
5333     *              is the underlying object with id, value and extensions. The
5334     *              accessor "getFactor" gives direct access to the value
5335     */
5336    public ItemComponent setFactorElement(DecimalType value) {
5337      this.factor = value;
5338      return this;
5339    }
5340
5341    /**
5342     * @return A real number that represents a multiplier used in determining the
5343     *         overall value of services delivered and/or goods received. The
5344     *         concept of a Factor allows for a discount or surcharge multiplier to
5345     *         be applied to a monetary amount.
5346     */
5347    public BigDecimal getFactor() {
5348      return this.factor == null ? null : this.factor.getValue();
5349    }
5350
5351    /**
5352     * @param value A real number that represents a multiplier used in determining
5353     *              the overall value of services delivered and/or goods received.
5354     *              The concept of a Factor allows for a discount or surcharge
5355     *              multiplier to be applied to a monetary amount.
5356     */
5357    public ItemComponent setFactor(BigDecimal value) {
5358      if (value == null)
5359        this.factor = null;
5360      else {
5361        if (this.factor == null)
5362          this.factor = new DecimalType();
5363        this.factor.setValue(value);
5364      }
5365      return this;
5366    }
5367
5368    /**
5369     * @param value A real number that represents a multiplier used in determining
5370     *              the overall value of services delivered and/or goods received.
5371     *              The concept of a Factor allows for a discount or surcharge
5372     *              multiplier to be applied to a monetary amount.
5373     */
5374    public ItemComponent setFactor(long value) {
5375      this.factor = new DecimalType();
5376      this.factor.setValue(value);
5377      return this;
5378    }
5379
5380    /**
5381     * @param value A real number that represents a multiplier used in determining
5382     *              the overall value of services delivered and/or goods received.
5383     *              The concept of a Factor allows for a discount or surcharge
5384     *              multiplier to be applied to a monetary amount.
5385     */
5386    public ItemComponent setFactor(double value) {
5387      this.factor = new DecimalType();
5388      this.factor.setValue(value);
5389      return this;
5390    }
5391
5392    /**
5393     * @return {@link #net} (The quantity times the unit price for an additional
5394     *         service or product or charge.)
5395     */
5396    public Money getNet() {
5397      if (this.net == null)
5398        if (Configuration.errorOnAutoCreate())
5399          throw new Error("Attempt to auto-create ItemComponent.net");
5400        else if (Configuration.doAutoCreate())
5401          this.net = new Money(); // cc
5402      return this.net;
5403    }
5404
5405    public boolean hasNet() {
5406      return this.net != null && !this.net.isEmpty();
5407    }
5408
5409    /**
5410     * @param value {@link #net} (The quantity times the unit price for an
5411     *              additional service or product or charge.)
5412     */
5413    public ItemComponent setNet(Money value) {
5414      this.net = value;
5415      return this;
5416    }
5417
5418    /**
5419     * @return {@link #udi} (Unique Device Identifiers associated with this line
5420     *         item.)
5421     */
5422    public List<Reference> getUdi() {
5423      if (this.udi == null)
5424        this.udi = new ArrayList<Reference>();
5425      return this.udi;
5426    }
5427
5428    /**
5429     * @return Returns a reference to <code>this</code> for easy method chaining
5430     */
5431    public ItemComponent setUdi(List<Reference> theUdi) {
5432      this.udi = theUdi;
5433      return this;
5434    }
5435
5436    public boolean hasUdi() {
5437      if (this.udi == null)
5438        return false;
5439      for (Reference item : this.udi)
5440        if (!item.isEmpty())
5441          return true;
5442      return false;
5443    }
5444
5445    public Reference addUdi() { // 3
5446      Reference t = new Reference();
5447      if (this.udi == null)
5448        this.udi = new ArrayList<Reference>();
5449      this.udi.add(t);
5450      return t;
5451    }
5452
5453    public ItemComponent addUdi(Reference t) { // 3
5454      if (t == null)
5455        return this;
5456      if (this.udi == null)
5457        this.udi = new ArrayList<Reference>();
5458      this.udi.add(t);
5459      return this;
5460    }
5461
5462    /**
5463     * @return The first repetition of repeating field {@link #udi}, creating it if
5464     *         it does not already exist
5465     */
5466    public Reference getUdiFirstRep() {
5467      if (getUdi().isEmpty()) {
5468        addUdi();
5469      }
5470      return getUdi().get(0);
5471    }
5472
5473    /**
5474     * @deprecated Use Reference#setResource(IBaseResource) instead
5475     */
5476    @Deprecated
5477    public List<Device> getUdiTarget() {
5478      if (this.udiTarget == null)
5479        this.udiTarget = new ArrayList<Device>();
5480      return this.udiTarget;
5481    }
5482
5483    /**
5484     * @deprecated Use Reference#setResource(IBaseResource) instead
5485     */
5486    @Deprecated
5487    public Device addUdiTarget() {
5488      Device r = new Device();
5489      if (this.udiTarget == null)
5490        this.udiTarget = new ArrayList<Device>();
5491      this.udiTarget.add(r);
5492      return r;
5493    }
5494
5495    /**
5496     * @return {@link #bodySite} (Physical service site on the patient (limb, tooth,
5497     *         etc.).)
5498     */
5499    public CodeableConcept getBodySite() {
5500      if (this.bodySite == null)
5501        if (Configuration.errorOnAutoCreate())
5502          throw new Error("Attempt to auto-create ItemComponent.bodySite");
5503        else if (Configuration.doAutoCreate())
5504          this.bodySite = new CodeableConcept(); // cc
5505      return this.bodySite;
5506    }
5507
5508    public boolean hasBodySite() {
5509      return this.bodySite != null && !this.bodySite.isEmpty();
5510    }
5511
5512    /**
5513     * @param value {@link #bodySite} (Physical service site on the patient (limb,
5514     *              tooth, etc.).)
5515     */
5516    public ItemComponent setBodySite(CodeableConcept value) {
5517      this.bodySite = value;
5518      return this;
5519    }
5520
5521    /**
5522     * @return {@link #subSite} (A region or surface of the bodySite, e.g. limb
5523     *         region or tooth surface(s).)
5524     */
5525    public List<CodeableConcept> getSubSite() {
5526      if (this.subSite == null)
5527        this.subSite = new ArrayList<CodeableConcept>();
5528      return this.subSite;
5529    }
5530
5531    /**
5532     * @return Returns a reference to <code>this</code> for easy method chaining
5533     */
5534    public ItemComponent setSubSite(List<CodeableConcept> theSubSite) {
5535      this.subSite = theSubSite;
5536      return this;
5537    }
5538
5539    public boolean hasSubSite() {
5540      if (this.subSite == null)
5541        return false;
5542      for (CodeableConcept item : this.subSite)
5543        if (!item.isEmpty())
5544          return true;
5545      return false;
5546    }
5547
5548    public CodeableConcept addSubSite() { // 3
5549      CodeableConcept t = new CodeableConcept();
5550      if (this.subSite == null)
5551        this.subSite = new ArrayList<CodeableConcept>();
5552      this.subSite.add(t);
5553      return t;
5554    }
5555
5556    public ItemComponent addSubSite(CodeableConcept t) { // 3
5557      if (t == null)
5558        return this;
5559      if (this.subSite == null)
5560        this.subSite = new ArrayList<CodeableConcept>();
5561      this.subSite.add(t);
5562      return this;
5563    }
5564
5565    /**
5566     * @return The first repetition of repeating field {@link #subSite}, creating it
5567     *         if it does not already exist
5568     */
5569    public CodeableConcept getSubSiteFirstRep() {
5570      if (getSubSite().isEmpty()) {
5571        addSubSite();
5572      }
5573      return getSubSite().get(0);
5574    }
5575
5576    /**
5577     * @return {@link #encounter} (The Encounters during which this Claim was
5578     *         created or to which the creation of this record is tightly
5579     *         associated.)
5580     */
5581    public List<Reference> getEncounter() {
5582      if (this.encounter == null)
5583        this.encounter = new ArrayList<Reference>();
5584      return this.encounter;
5585    }
5586
5587    /**
5588     * @return Returns a reference to <code>this</code> for easy method chaining
5589     */
5590    public ItemComponent setEncounter(List<Reference> theEncounter) {
5591      this.encounter = theEncounter;
5592      return this;
5593    }
5594
5595    public boolean hasEncounter() {
5596      if (this.encounter == null)
5597        return false;
5598      for (Reference item : this.encounter)
5599        if (!item.isEmpty())
5600          return true;
5601      return false;
5602    }
5603
5604    public Reference addEncounter() { // 3
5605      Reference t = new Reference();
5606      if (this.encounter == null)
5607        this.encounter = new ArrayList<Reference>();
5608      this.encounter.add(t);
5609      return t;
5610    }
5611
5612    public ItemComponent addEncounter(Reference t) { // 3
5613      if (t == null)
5614        return this;
5615      if (this.encounter == null)
5616        this.encounter = new ArrayList<Reference>();
5617      this.encounter.add(t);
5618      return this;
5619    }
5620
5621    /**
5622     * @return The first repetition of repeating field {@link #encounter}, creating
5623     *         it if it does not already exist
5624     */
5625    public Reference getEncounterFirstRep() {
5626      if (getEncounter().isEmpty()) {
5627        addEncounter();
5628      }
5629      return getEncounter().get(0);
5630    }
5631
5632    /**
5633     * @deprecated Use Reference#setResource(IBaseResource) instead
5634     */
5635    @Deprecated
5636    public List<Encounter> getEncounterTarget() {
5637      if (this.encounterTarget == null)
5638        this.encounterTarget = new ArrayList<Encounter>();
5639      return this.encounterTarget;
5640    }
5641
5642    /**
5643     * @deprecated Use Reference#setResource(IBaseResource) instead
5644     */
5645    @Deprecated
5646    public Encounter addEncounterTarget() {
5647      Encounter r = new Encounter();
5648      if (this.encounterTarget == null)
5649        this.encounterTarget = new ArrayList<Encounter>();
5650      this.encounterTarget.add(r);
5651      return r;
5652    }
5653
5654    /**
5655     * @return {@link #detail} (A claim detail line. Either a simple (a product or
5656     *         service) or a 'group' of sub-details which are simple items.)
5657     */
5658    public List<DetailComponent> getDetail() {
5659      if (this.detail == null)
5660        this.detail = new ArrayList<DetailComponent>();
5661      return this.detail;
5662    }
5663
5664    /**
5665     * @return Returns a reference to <code>this</code> for easy method chaining
5666     */
5667    public ItemComponent setDetail(List<DetailComponent> theDetail) {
5668      this.detail = theDetail;
5669      return this;
5670    }
5671
5672    public boolean hasDetail() {
5673      if (this.detail == null)
5674        return false;
5675      for (DetailComponent item : this.detail)
5676        if (!item.isEmpty())
5677          return true;
5678      return false;
5679    }
5680
5681    public DetailComponent addDetail() { // 3
5682      DetailComponent t = new DetailComponent();
5683      if (this.detail == null)
5684        this.detail = new ArrayList<DetailComponent>();
5685      this.detail.add(t);
5686      return t;
5687    }
5688
5689    public ItemComponent addDetail(DetailComponent t) { // 3
5690      if (t == null)
5691        return this;
5692      if (this.detail == null)
5693        this.detail = new ArrayList<DetailComponent>();
5694      this.detail.add(t);
5695      return this;
5696    }
5697
5698    /**
5699     * @return The first repetition of repeating field {@link #detail}, creating it
5700     *         if it does not already exist
5701     */
5702    public DetailComponent getDetailFirstRep() {
5703      if (getDetail().isEmpty()) {
5704        addDetail();
5705      }
5706      return getDetail().get(0);
5707    }
5708
5709    protected void listChildren(List<Property> children) {
5710      super.listChildren(children);
5711      children
5712          .add(new Property("sequence", "positiveInt", "A number to uniquely identify item entries.", 0, 1, sequence));
5713      children.add(new Property("careTeamSequence", "positiveInt",
5714          "CareTeam members related to this service or product.", 0, java.lang.Integer.MAX_VALUE, careTeamSequence));
5715      children.add(new Property("diagnosisSequence", "positiveInt", "Diagnosis applicable for this service or product.",
5716          0, java.lang.Integer.MAX_VALUE, diagnosisSequence));
5717      children.add(new Property("procedureSequence", "positiveInt",
5718          "Procedures applicable for this service or product.", 0, java.lang.Integer.MAX_VALUE, procedureSequence));
5719      children.add(new Property("informationSequence", "positiveInt",
5720          "Exceptions, special conditions and supporting information applicable for this service or product.", 0,
5721          java.lang.Integer.MAX_VALUE, informationSequence));
5722      children.add(new Property("revenue", "CodeableConcept",
5723          "The type of revenue or cost center providing the product and/or service.", 0, 1, revenue));
5724      children.add(new Property("category", "CodeableConcept",
5725          "Code to identify the general type of benefits under which products and services are provided.", 0, 1,
5726          category));
5727      children.add(new Property("productOrService", "CodeableConcept",
5728          "When the value is a group code then this item collects a set of related claim details, otherwise this contains the product, service, drug or other billing code for the item.",
5729          0, 1, productOrService));
5730      children.add(new Property("modifier", "CodeableConcept",
5731          "Item typification or modifiers codes to convey additional context for the product or service.", 0,
5732          java.lang.Integer.MAX_VALUE, modifier));
5733      children.add(new Property("programCode", "CodeableConcept",
5734          "Identifies the program under which this may be recovered.", 0, java.lang.Integer.MAX_VALUE, programCode));
5735      children.add(new Property("serviced[x]", "date|Period",
5736          "The date or dates when the service or product was supplied, performed or completed.", 0, 1, serviced));
5737      children.add(new Property("location[x]", "CodeableConcept|Address|Reference(Location)",
5738          "Where the product or service was provided.", 0, 1, location));
5739      children.add(new Property("quantity", "SimpleQuantity", "The number of repetitions of a service or product.", 0,
5740          1, quantity));
5741      children.add(new Property("unitPrice", "Money",
5742          "If the item is not a group then this is the fee for the product or service, otherwise this is the total of the fees for the details of the group.",
5743          0, 1, unitPrice));
5744      children.add(new Property("factor", "decimal",
5745          "A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.",
5746          0, 1, factor));
5747      children.add(new Property("net", "Money",
5748          "The quantity times the unit price for an additional service or product or charge.", 0, 1, net));
5749      children.add(new Property("udi", "Reference(Device)", "Unique Device Identifiers associated with this line item.",
5750          0, java.lang.Integer.MAX_VALUE, udi));
5751      children.add(new Property("bodySite", "CodeableConcept",
5752          "Physical service site on the patient (limb, tooth, etc.).", 0, 1, bodySite));
5753      children.add(new Property("subSite", "CodeableConcept",
5754          "A region or surface of the bodySite, e.g. limb region or tooth surface(s).", 0, java.lang.Integer.MAX_VALUE,
5755          subSite));
5756      children.add(new Property("encounter", "Reference(Encounter)",
5757          "The Encounters during which this Claim was created or to which the creation of this record is tightly associated.",
5758          0, java.lang.Integer.MAX_VALUE, encounter));
5759      children.add(new Property("detail", "",
5760          "A claim detail line. Either a simple (a product or service) or a 'group' of sub-details which are simple items.",
5761          0, java.lang.Integer.MAX_VALUE, detail));
5762    }
5763
5764    @Override
5765    public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
5766      switch (_hash) {
5767      case 1349547969:
5768        /* sequence */ return new Property("sequence", "positiveInt", "A number to uniquely identify item entries.", 0,
5769            1, sequence);
5770      case 1070083823:
5771        /* careTeamSequence */ return new Property("careTeamSequence", "positiveInt",
5772            "CareTeam members related to this service or product.", 0, java.lang.Integer.MAX_VALUE, careTeamSequence);
5773      case -909769262:
5774        /* diagnosisSequence */ return new Property("diagnosisSequence", "positiveInt",
5775            "Diagnosis applicable for this service or product.", 0, java.lang.Integer.MAX_VALUE, diagnosisSequence);
5776      case -808920140:
5777        /* procedureSequence */ return new Property("procedureSequence", "positiveInt",
5778            "Procedures applicable for this service or product.", 0, java.lang.Integer.MAX_VALUE, procedureSequence);
5779      case -702585587:
5780        /* informationSequence */ return new Property("informationSequence", "positiveInt",
5781            "Exceptions, special conditions and supporting information applicable for this service or product.", 0,
5782            java.lang.Integer.MAX_VALUE, informationSequence);
5783      case 1099842588:
5784        /* revenue */ return new Property("revenue", "CodeableConcept",
5785            "The type of revenue or cost center providing the product and/or service.", 0, 1, revenue);
5786      case 50511102:
5787        /* category */ return new Property("category", "CodeableConcept",
5788            "Code to identify the general type of benefits under which products and services are provided.", 0, 1,
5789            category);
5790      case 1957227299:
5791        /* productOrService */ return new Property("productOrService", "CodeableConcept",
5792            "When the value is a group code then this item collects a set of related claim details, otherwise this contains the product, service, drug or other billing code for the item.",
5793            0, 1, productOrService);
5794      case -615513385:
5795        /* modifier */ return new Property("modifier", "CodeableConcept",
5796            "Item typification or modifiers codes to convey additional context for the product or service.", 0,
5797            java.lang.Integer.MAX_VALUE, modifier);
5798      case 1010065041:
5799        /* programCode */ return new Property("programCode", "CodeableConcept",
5800            "Identifies the program under which this may be recovered.", 0, java.lang.Integer.MAX_VALUE, programCode);
5801      case -1927922223:
5802        /* serviced[x] */ return new Property("serviced[x]", "date|Period",
5803            "The date or dates when the service or product was supplied, performed or completed.", 0, 1, serviced);
5804      case 1379209295:
5805        /* serviced */ return new Property("serviced[x]", "date|Period",
5806            "The date or dates when the service or product was supplied, performed or completed.", 0, 1, serviced);
5807      case 363246749:
5808        /* servicedDate */ return new Property("serviced[x]", "date|Period",
5809            "The date or dates when the service or product was supplied, performed or completed.", 0, 1, serviced);
5810      case 1534966512:
5811        /* servicedPeriod */ return new Property("serviced[x]", "date|Period",
5812            "The date or dates when the service or product was supplied, performed or completed.", 0, 1, serviced);
5813      case 552316075:
5814        /* location[x] */ return new Property("location[x]", "CodeableConcept|Address|Reference(Location)",
5815            "Where the product or service was provided.", 0, 1, location);
5816      case 1901043637:
5817        /* location */ return new Property("location[x]", "CodeableConcept|Address|Reference(Location)",
5818            "Where the product or service was provided.", 0, 1, location);
5819      case -1224800468:
5820        /* locationCodeableConcept */ return new Property("location[x]", "CodeableConcept|Address|Reference(Location)",
5821            "Where the product or service was provided.", 0, 1, location);
5822      case -1280020865:
5823        /* locationAddress */ return new Property("location[x]", "CodeableConcept|Address|Reference(Location)",
5824            "Where the product or service was provided.", 0, 1, location);
5825      case 755866390:
5826        /* locationReference */ return new Property("location[x]", "CodeableConcept|Address|Reference(Location)",
5827            "Where the product or service was provided.", 0, 1, location);
5828      case -1285004149:
5829        /* quantity */ return new Property("quantity", "SimpleQuantity",
5830            "The number of repetitions of a service or product.", 0, 1, quantity);
5831      case -486196699:
5832        /* unitPrice */ return new Property("unitPrice", "Money",
5833            "If the item is not a group then this is the fee for the product or service, otherwise this is the total of the fees for the details of the group.",
5834            0, 1, unitPrice);
5835      case -1282148017:
5836        /* factor */ return new Property("factor", "decimal",
5837            "A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.",
5838            0, 1, factor);
5839      case 108957:
5840        /* net */ return new Property("net", "Money",
5841            "The quantity times the unit price for an additional service or product or charge.", 0, 1, net);
5842      case 115642:
5843        /* udi */ return new Property("udi", "Reference(Device)",
5844            "Unique Device Identifiers associated with this line item.", 0, java.lang.Integer.MAX_VALUE, udi);
5845      case 1702620169:
5846        /* bodySite */ return new Property("bodySite", "CodeableConcept",
5847            "Physical service site on the patient (limb, tooth, etc.).", 0, 1, bodySite);
5848      case -1868566105:
5849        /* subSite */ return new Property("subSite", "CodeableConcept",
5850            "A region or surface of the bodySite, e.g. limb region or tooth surface(s).", 0,
5851            java.lang.Integer.MAX_VALUE, subSite);
5852      case 1524132147:
5853        /* encounter */ return new Property("encounter", "Reference(Encounter)",
5854            "The Encounters during which this Claim was created or to which the creation of this record is tightly associated.",
5855            0, java.lang.Integer.MAX_VALUE, encounter);
5856      case -1335224239:
5857        /* detail */ return new Property("detail", "",
5858            "A claim detail line. Either a simple (a product or service) or a 'group' of sub-details which are simple items.",
5859            0, java.lang.Integer.MAX_VALUE, detail);
5860      default:
5861        return super.getNamedProperty(_hash, _name, _checkValid);
5862      }
5863
5864    }
5865
5866    @Override
5867    public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
5868      switch (hash) {
5869      case 1349547969:
5870        /* sequence */ return this.sequence == null ? new Base[0] : new Base[] { this.sequence }; // PositiveIntType
5871      case 1070083823:
5872        /* careTeamSequence */ return this.careTeamSequence == null ? new Base[0]
5873            : this.careTeamSequence.toArray(new Base[this.careTeamSequence.size()]); // PositiveIntType
5874      case -909769262:
5875        /* diagnosisSequence */ return this.diagnosisSequence == null ? new Base[0]
5876            : this.diagnosisSequence.toArray(new Base[this.diagnosisSequence.size()]); // PositiveIntType
5877      case -808920140:
5878        /* procedureSequence */ return this.procedureSequence == null ? new Base[0]
5879            : this.procedureSequence.toArray(new Base[this.procedureSequence.size()]); // PositiveIntType
5880      case -702585587:
5881        /* informationSequence */ return this.informationSequence == null ? new Base[0]
5882            : this.informationSequence.toArray(new Base[this.informationSequence.size()]); // PositiveIntType
5883      case 1099842588:
5884        /* revenue */ return this.revenue == null ? new Base[0] : new Base[] { this.revenue }; // CodeableConcept
5885      case 50511102:
5886        /* category */ return this.category == null ? new Base[0] : new Base[] { this.category }; // CodeableConcept
5887      case 1957227299:
5888        /* productOrService */ return this.productOrService == null ? new Base[0]
5889            : new Base[] { this.productOrService }; // CodeableConcept
5890      case -615513385:
5891        /* modifier */ return this.modifier == null ? new Base[0]
5892            : this.modifier.toArray(new Base[this.modifier.size()]); // CodeableConcept
5893      case 1010065041:
5894        /* programCode */ return this.programCode == null ? new Base[0]
5895            : this.programCode.toArray(new Base[this.programCode.size()]); // CodeableConcept
5896      case 1379209295:
5897        /* serviced */ return this.serviced == null ? new Base[0] : new Base[] { this.serviced }; // Type
5898      case 1901043637:
5899        /* location */ return this.location == null ? new Base[0] : new Base[] { this.location }; // Type
5900      case -1285004149:
5901        /* quantity */ return this.quantity == null ? new Base[0] : new Base[] { this.quantity }; // Quantity
5902      case -486196699:
5903        /* unitPrice */ return this.unitPrice == null ? new Base[0] : new Base[] { this.unitPrice }; // Money
5904      case -1282148017:
5905        /* factor */ return this.factor == null ? new Base[0] : new Base[] { this.factor }; // DecimalType
5906      case 108957:
5907        /* net */ return this.net == null ? new Base[0] : new Base[] { this.net }; // Money
5908      case 115642:
5909        /* udi */ return this.udi == null ? new Base[0] : this.udi.toArray(new Base[this.udi.size()]); // Reference
5910      case 1702620169:
5911        /* bodySite */ return this.bodySite == null ? new Base[0] : new Base[] { this.bodySite }; // CodeableConcept
5912      case -1868566105:
5913        /* subSite */ return this.subSite == null ? new Base[0] : this.subSite.toArray(new Base[this.subSite.size()]); // CodeableConcept
5914      case 1524132147:
5915        /* encounter */ return this.encounter == null ? new Base[0]
5916            : this.encounter.toArray(new Base[this.encounter.size()]); // Reference
5917      case -1335224239:
5918        /* detail */ return this.detail == null ? new Base[0] : this.detail.toArray(new Base[this.detail.size()]); // DetailComponent
5919      default:
5920        return super.getProperty(hash, name, checkValid);
5921      }
5922
5923    }
5924
5925    @Override
5926    public Base setProperty(int hash, String name, Base value) throws FHIRException {
5927      switch (hash) {
5928      case 1349547969: // sequence
5929        this.sequence = castToPositiveInt(value); // PositiveIntType
5930        return value;
5931      case 1070083823: // careTeamSequence
5932        this.getCareTeamSequence().add(castToPositiveInt(value)); // PositiveIntType
5933        return value;
5934      case -909769262: // diagnosisSequence
5935        this.getDiagnosisSequence().add(castToPositiveInt(value)); // PositiveIntType
5936        return value;
5937      case -808920140: // procedureSequence
5938        this.getProcedureSequence().add(castToPositiveInt(value)); // PositiveIntType
5939        return value;
5940      case -702585587: // informationSequence
5941        this.getInformationSequence().add(castToPositiveInt(value)); // PositiveIntType
5942        return value;
5943      case 1099842588: // revenue
5944        this.revenue = castToCodeableConcept(value); // CodeableConcept
5945        return value;
5946      case 50511102: // category
5947        this.category = castToCodeableConcept(value); // CodeableConcept
5948        return value;
5949      case 1957227299: // productOrService
5950        this.productOrService = castToCodeableConcept(value); // CodeableConcept
5951        return value;
5952      case -615513385: // modifier
5953        this.getModifier().add(castToCodeableConcept(value)); // CodeableConcept
5954        return value;
5955      case 1010065041: // programCode
5956        this.getProgramCode().add(castToCodeableConcept(value)); // CodeableConcept
5957        return value;
5958      case 1379209295: // serviced
5959        this.serviced = castToType(value); // Type
5960        return value;
5961      case 1901043637: // location
5962        this.location = castToType(value); // Type
5963        return value;
5964      case -1285004149: // quantity
5965        this.quantity = castToQuantity(value); // Quantity
5966        return value;
5967      case -486196699: // unitPrice
5968        this.unitPrice = castToMoney(value); // Money
5969        return value;
5970      case -1282148017: // factor
5971        this.factor = castToDecimal(value); // DecimalType
5972        return value;
5973      case 108957: // net
5974        this.net = castToMoney(value); // Money
5975        return value;
5976      case 115642: // udi
5977        this.getUdi().add(castToReference(value)); // Reference
5978        return value;
5979      case 1702620169: // bodySite
5980        this.bodySite = castToCodeableConcept(value); // CodeableConcept
5981        return value;
5982      case -1868566105: // subSite
5983        this.getSubSite().add(castToCodeableConcept(value)); // CodeableConcept
5984        return value;
5985      case 1524132147: // encounter
5986        this.getEncounter().add(castToReference(value)); // Reference
5987        return value;
5988      case -1335224239: // detail
5989        this.getDetail().add((DetailComponent) value); // DetailComponent
5990        return value;
5991      default:
5992        return super.setProperty(hash, name, value);
5993      }
5994
5995    }
5996
5997    @Override
5998    public Base setProperty(String name, Base value) throws FHIRException {
5999      if (name.equals("sequence")) {
6000        this.sequence = castToPositiveInt(value); // PositiveIntType
6001      } else if (name.equals("careTeamSequence")) {
6002        this.getCareTeamSequence().add(castToPositiveInt(value));
6003      } else if (name.equals("diagnosisSequence")) {
6004        this.getDiagnosisSequence().add(castToPositiveInt(value));
6005      } else if (name.equals("procedureSequence")) {
6006        this.getProcedureSequence().add(castToPositiveInt(value));
6007      } else if (name.equals("informationSequence")) {
6008        this.getInformationSequence().add(castToPositiveInt(value));
6009      } else if (name.equals("revenue")) {
6010        this.revenue = castToCodeableConcept(value); // CodeableConcept
6011      } else if (name.equals("category")) {
6012        this.category = castToCodeableConcept(value); // CodeableConcept
6013      } else if (name.equals("productOrService")) {
6014        this.productOrService = castToCodeableConcept(value); // CodeableConcept
6015      } else if (name.equals("modifier")) {
6016        this.getModifier().add(castToCodeableConcept(value));
6017      } else if (name.equals("programCode")) {
6018        this.getProgramCode().add(castToCodeableConcept(value));
6019      } else if (name.equals("serviced[x]")) {
6020        this.serviced = castToType(value); // Type
6021      } else if (name.equals("location[x]")) {
6022        this.location = castToType(value); // Type
6023      } else if (name.equals("quantity")) {
6024        this.quantity = castToQuantity(value); // Quantity
6025      } else if (name.equals("unitPrice")) {
6026        this.unitPrice = castToMoney(value); // Money
6027      } else if (name.equals("factor")) {
6028        this.factor = castToDecimal(value); // DecimalType
6029      } else if (name.equals("net")) {
6030        this.net = castToMoney(value); // Money
6031      } else if (name.equals("udi")) {
6032        this.getUdi().add(castToReference(value));
6033      } else if (name.equals("bodySite")) {
6034        this.bodySite = castToCodeableConcept(value); // CodeableConcept
6035      } else if (name.equals("subSite")) {
6036        this.getSubSite().add(castToCodeableConcept(value));
6037      } else if (name.equals("encounter")) {
6038        this.getEncounter().add(castToReference(value));
6039      } else if (name.equals("detail")) {
6040        this.getDetail().add((DetailComponent) value);
6041      } else
6042        return super.setProperty(name, value);
6043      return value;
6044    }
6045
6046  @Override
6047  public void removeChild(String name, Base value) throws FHIRException {
6048      if (name.equals("sequence")) {
6049        this.sequence = null;
6050      } else if (name.equals("careTeamSequence")) {
6051        this.getCareTeamSequence().remove(castToPositiveInt(value));
6052      } else if (name.equals("diagnosisSequence")) {
6053        this.getDiagnosisSequence().remove(castToPositiveInt(value));
6054      } else if (name.equals("procedureSequence")) {
6055        this.getProcedureSequence().remove(castToPositiveInt(value));
6056      } else if (name.equals("informationSequence")) {
6057        this.getInformationSequence().remove(castToPositiveInt(value));
6058      } else if (name.equals("revenue")) {
6059        this.revenue = null;
6060      } else if (name.equals("category")) {
6061        this.category = null;
6062      } else if (name.equals("productOrService")) {
6063        this.productOrService = null;
6064      } else if (name.equals("modifier")) {
6065        this.getModifier().remove(castToCodeableConcept(value));
6066      } else if (name.equals("programCode")) {
6067        this.getProgramCode().remove(castToCodeableConcept(value));
6068      } else if (name.equals("serviced[x]")) {
6069        this.serviced = null;
6070      } else if (name.equals("location[x]")) {
6071        this.location = null;
6072      } else if (name.equals("quantity")) {
6073        this.quantity = null;
6074      } else if (name.equals("unitPrice")) {
6075        this.unitPrice = null;
6076      } else if (name.equals("factor")) {
6077        this.factor = null;
6078      } else if (name.equals("net")) {
6079        this.net = null;
6080      } else if (name.equals("udi")) {
6081        this.getUdi().remove(castToReference(value));
6082      } else if (name.equals("bodySite")) {
6083        this.bodySite = null;
6084      } else if (name.equals("subSite")) {
6085        this.getSubSite().remove(castToCodeableConcept(value));
6086      } else if (name.equals("encounter")) {
6087        this.getEncounter().remove(castToReference(value));
6088      } else if (name.equals("detail")) {
6089        this.getDetail().remove((DetailComponent) value);
6090      } else
6091        super.removeChild(name, value);
6092      
6093    }
6094
6095    @Override
6096    public Base makeProperty(int hash, String name) throws FHIRException {
6097      switch (hash) {
6098      case 1349547969:
6099        return getSequenceElement();
6100      case 1070083823:
6101        return addCareTeamSequenceElement();
6102      case -909769262:
6103        return addDiagnosisSequenceElement();
6104      case -808920140:
6105        return addProcedureSequenceElement();
6106      case -702585587:
6107        return addInformationSequenceElement();
6108      case 1099842588:
6109        return getRevenue();
6110      case 50511102:
6111        return getCategory();
6112      case 1957227299:
6113        return getProductOrService();
6114      case -615513385:
6115        return addModifier();
6116      case 1010065041:
6117        return addProgramCode();
6118      case -1927922223:
6119        return getServiced();
6120      case 1379209295:
6121        return getServiced();
6122      case 552316075:
6123        return getLocation();
6124      case 1901043637:
6125        return getLocation();
6126      case -1285004149:
6127        return getQuantity();
6128      case -486196699:
6129        return getUnitPrice();
6130      case -1282148017:
6131        return getFactorElement();
6132      case 108957:
6133        return getNet();
6134      case 115642:
6135        return addUdi();
6136      case 1702620169:
6137        return getBodySite();
6138      case -1868566105:
6139        return addSubSite();
6140      case 1524132147:
6141        return addEncounter();
6142      case -1335224239:
6143        return addDetail();
6144      default:
6145        return super.makeProperty(hash, name);
6146      }
6147
6148    }
6149
6150    @Override
6151    public String[] getTypesForProperty(int hash, String name) throws FHIRException {
6152      switch (hash) {
6153      case 1349547969:
6154        /* sequence */ return new String[] { "positiveInt" };
6155      case 1070083823:
6156        /* careTeamSequence */ return new String[] { "positiveInt" };
6157      case -909769262:
6158        /* diagnosisSequence */ return new String[] { "positiveInt" };
6159      case -808920140:
6160        /* procedureSequence */ return new String[] { "positiveInt" };
6161      case -702585587:
6162        /* informationSequence */ return new String[] { "positiveInt" };
6163      case 1099842588:
6164        /* revenue */ return new String[] { "CodeableConcept" };
6165      case 50511102:
6166        /* category */ return new String[] { "CodeableConcept" };
6167      case 1957227299:
6168        /* productOrService */ return new String[] { "CodeableConcept" };
6169      case -615513385:
6170        /* modifier */ return new String[] { "CodeableConcept" };
6171      case 1010065041:
6172        /* programCode */ return new String[] { "CodeableConcept" };
6173      case 1379209295:
6174        /* serviced */ return new String[] { "date", "Period" };
6175      case 1901043637:
6176        /* location */ return new String[] { "CodeableConcept", "Address", "Reference" };
6177      case -1285004149:
6178        /* quantity */ return new String[] { "SimpleQuantity" };
6179      case -486196699:
6180        /* unitPrice */ return new String[] { "Money" };
6181      case -1282148017:
6182        /* factor */ return new String[] { "decimal" };
6183      case 108957:
6184        /* net */ return new String[] { "Money" };
6185      case 115642:
6186        /* udi */ return new String[] { "Reference" };
6187      case 1702620169:
6188        /* bodySite */ return new String[] { "CodeableConcept" };
6189      case -1868566105:
6190        /* subSite */ return new String[] { "CodeableConcept" };
6191      case 1524132147:
6192        /* encounter */ return new String[] { "Reference" };
6193      case -1335224239:
6194        /* detail */ return new String[] {};
6195      default:
6196        return super.getTypesForProperty(hash, name);
6197      }
6198
6199    }
6200
6201    @Override
6202    public Base addChild(String name) throws FHIRException {
6203      if (name.equals("sequence")) {
6204        throw new FHIRException("Cannot call addChild on a singleton property Claim.sequence");
6205      } else if (name.equals("careTeamSequence")) {
6206        throw new FHIRException("Cannot call addChild on a singleton property Claim.careTeamSequence");
6207      } else if (name.equals("diagnosisSequence")) {
6208        throw new FHIRException("Cannot call addChild on a singleton property Claim.diagnosisSequence");
6209      } else if (name.equals("procedureSequence")) {
6210        throw new FHIRException("Cannot call addChild on a singleton property Claim.procedureSequence");
6211      } else if (name.equals("informationSequence")) {
6212        throw new FHIRException("Cannot call addChild on a singleton property Claim.informationSequence");
6213      } else if (name.equals("revenue")) {
6214        this.revenue = new CodeableConcept();
6215        return this.revenue;
6216      } else if (name.equals("category")) {
6217        this.category = new CodeableConcept();
6218        return this.category;
6219      } else if (name.equals("productOrService")) {
6220        this.productOrService = new CodeableConcept();
6221        return this.productOrService;
6222      } else if (name.equals("modifier")) {
6223        return addModifier();
6224      } else if (name.equals("programCode")) {
6225        return addProgramCode();
6226      } else if (name.equals("servicedDate")) {
6227        this.serviced = new DateType();
6228        return this.serviced;
6229      } else if (name.equals("servicedPeriod")) {
6230        this.serviced = new Period();
6231        return this.serviced;
6232      } else if (name.equals("locationCodeableConcept")) {
6233        this.location = new CodeableConcept();
6234        return this.location;
6235      } else if (name.equals("locationAddress")) {
6236        this.location = new Address();
6237        return this.location;
6238      } else if (name.equals("locationReference")) {
6239        this.location = new Reference();
6240        return this.location;
6241      } else if (name.equals("quantity")) {
6242        this.quantity = new Quantity();
6243        return this.quantity;
6244      } else if (name.equals("unitPrice")) {
6245        this.unitPrice = new Money();
6246        return this.unitPrice;
6247      } else if (name.equals("factor")) {
6248        throw new FHIRException("Cannot call addChild on a singleton property Claim.factor");
6249      } else if (name.equals("net")) {
6250        this.net = new Money();
6251        return this.net;
6252      } else if (name.equals("udi")) {
6253        return addUdi();
6254      } else if (name.equals("bodySite")) {
6255        this.bodySite = new CodeableConcept();
6256        return this.bodySite;
6257      } else if (name.equals("subSite")) {
6258        return addSubSite();
6259      } else if (name.equals("encounter")) {
6260        return addEncounter();
6261      } else if (name.equals("detail")) {
6262        return addDetail();
6263      } else
6264        return super.addChild(name);
6265    }
6266
6267    public ItemComponent copy() {
6268      ItemComponent dst = new ItemComponent();
6269      copyValues(dst);
6270      return dst;
6271    }
6272
6273    public void copyValues(ItemComponent dst) {
6274      super.copyValues(dst);
6275      dst.sequence = sequence == null ? null : sequence.copy();
6276      if (careTeamSequence != null) {
6277        dst.careTeamSequence = new ArrayList<PositiveIntType>();
6278        for (PositiveIntType i : careTeamSequence)
6279          dst.careTeamSequence.add(i.copy());
6280      }
6281      ;
6282      if (diagnosisSequence != null) {
6283        dst.diagnosisSequence = new ArrayList<PositiveIntType>();
6284        for (PositiveIntType i : diagnosisSequence)
6285          dst.diagnosisSequence.add(i.copy());
6286      }
6287      ;
6288      if (procedureSequence != null) {
6289        dst.procedureSequence = new ArrayList<PositiveIntType>();
6290        for (PositiveIntType i : procedureSequence)
6291          dst.procedureSequence.add(i.copy());
6292      }
6293      ;
6294      if (informationSequence != null) {
6295        dst.informationSequence = new ArrayList<PositiveIntType>();
6296        for (PositiveIntType i : informationSequence)
6297          dst.informationSequence.add(i.copy());
6298      }
6299      ;
6300      dst.revenue = revenue == null ? null : revenue.copy();
6301      dst.category = category == null ? null : category.copy();
6302      dst.productOrService = productOrService == null ? null : productOrService.copy();
6303      if (modifier != null) {
6304        dst.modifier = new ArrayList<CodeableConcept>();
6305        for (CodeableConcept i : modifier)
6306          dst.modifier.add(i.copy());
6307      }
6308      ;
6309      if (programCode != null) {
6310        dst.programCode = new ArrayList<CodeableConcept>();
6311        for (CodeableConcept i : programCode)
6312          dst.programCode.add(i.copy());
6313      }
6314      ;
6315      dst.serviced = serviced == null ? null : serviced.copy();
6316      dst.location = location == null ? null : location.copy();
6317      dst.quantity = quantity == null ? null : quantity.copy();
6318      dst.unitPrice = unitPrice == null ? null : unitPrice.copy();
6319      dst.factor = factor == null ? null : factor.copy();
6320      dst.net = net == null ? null : net.copy();
6321      if (udi != null) {
6322        dst.udi = new ArrayList<Reference>();
6323        for (Reference i : udi)
6324          dst.udi.add(i.copy());
6325      }
6326      ;
6327      dst.bodySite = bodySite == null ? null : bodySite.copy();
6328      if (subSite != null) {
6329        dst.subSite = new ArrayList<CodeableConcept>();
6330        for (CodeableConcept i : subSite)
6331          dst.subSite.add(i.copy());
6332      }
6333      ;
6334      if (encounter != null) {
6335        dst.encounter = new ArrayList<Reference>();
6336        for (Reference i : encounter)
6337          dst.encounter.add(i.copy());
6338      }
6339      ;
6340      if (detail != null) {
6341        dst.detail = new ArrayList<DetailComponent>();
6342        for (DetailComponent i : detail)
6343          dst.detail.add(i.copy());
6344      }
6345      ;
6346    }
6347
6348    @Override
6349    public boolean equalsDeep(Base other_) {
6350      if (!super.equalsDeep(other_))
6351        return false;
6352      if (!(other_ instanceof ItemComponent))
6353        return false;
6354      ItemComponent o = (ItemComponent) other_;
6355      return compareDeep(sequence, o.sequence, true) && compareDeep(careTeamSequence, o.careTeamSequence, true)
6356          && compareDeep(diagnosisSequence, o.diagnosisSequence, true)
6357          && compareDeep(procedureSequence, o.procedureSequence, true)
6358          && compareDeep(informationSequence, o.informationSequence, true) && compareDeep(revenue, o.revenue, true)
6359          && compareDeep(category, o.category, true) && compareDeep(productOrService, o.productOrService, true)
6360          && compareDeep(modifier, o.modifier, true) && compareDeep(programCode, o.programCode, true)
6361          && compareDeep(serviced, o.serviced, true) && compareDeep(location, o.location, true)
6362          && compareDeep(quantity, o.quantity, true) && compareDeep(unitPrice, o.unitPrice, true)
6363          && compareDeep(factor, o.factor, true) && compareDeep(net, o.net, true) && compareDeep(udi, o.udi, true)
6364          && compareDeep(bodySite, o.bodySite, true) && compareDeep(subSite, o.subSite, true)
6365          && compareDeep(encounter, o.encounter, true) && compareDeep(detail, o.detail, true);
6366    }
6367
6368    @Override
6369    public boolean equalsShallow(Base other_) {
6370      if (!super.equalsShallow(other_))
6371        return false;
6372      if (!(other_ instanceof ItemComponent))
6373        return false;
6374      ItemComponent o = (ItemComponent) other_;
6375      return compareValues(sequence, o.sequence, true) && compareValues(careTeamSequence, o.careTeamSequence, true)
6376          && compareValues(diagnosisSequence, o.diagnosisSequence, true)
6377          && compareValues(procedureSequence, o.procedureSequence, true)
6378          && compareValues(informationSequence, o.informationSequence, true) && compareValues(factor, o.factor, true);
6379    }
6380
6381    public boolean isEmpty() {
6382      return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(sequence, careTeamSequence, diagnosisSequence,
6383          procedureSequence, informationSequence, revenue, category, productOrService, modifier, programCode, serviced,
6384          location, quantity, unitPrice, factor, net, udi, bodySite, subSite, encounter, detail);
6385    }
6386
6387    public String fhirType() {
6388      return "Claim.item";
6389
6390    }
6391
6392  }
6393
6394  @Block()
6395  public static class DetailComponent extends BackboneElement implements IBaseBackboneElement {
6396    /**
6397     * A number to uniquely identify item entries.
6398     */
6399    @Child(name = "sequence", type = {
6400        PositiveIntType.class }, order = 1, min = 1, max = 1, modifier = false, summary = false)
6401    @Description(shortDefinition = "Item instance identifier", formalDefinition = "A number to uniquely identify item entries.")
6402    protected PositiveIntType sequence;
6403
6404    /**
6405     * The type of revenue or cost center providing the product and/or service.
6406     */
6407    @Child(name = "revenue", type = {
6408        CodeableConcept.class }, order = 2, min = 0, max = 1, modifier = false, summary = false)
6409    @Description(shortDefinition = "Revenue or cost center code", formalDefinition = "The type of revenue or cost center providing the product and/or service.")
6410    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/ex-revenue-center")
6411    protected CodeableConcept revenue;
6412
6413    /**
6414     * Code to identify the general type of benefits under which products and
6415     * services are provided.
6416     */
6417    @Child(name = "category", type = {
6418        CodeableConcept.class }, order = 3, min = 0, max = 1, modifier = false, summary = false)
6419    @Description(shortDefinition = "Benefit classification", formalDefinition = "Code to identify the general type of benefits under which products and services are provided.")
6420    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/ex-benefitcategory")
6421    protected CodeableConcept category;
6422
6423    /**
6424     * When the value is a group code then this item collects a set of related claim
6425     * details, otherwise this contains the product, service, drug or other billing
6426     * code for the item.
6427     */
6428    @Child(name = "productOrService", type = {
6429        CodeableConcept.class }, order = 4, min = 1, max = 1, modifier = false, summary = false)
6430    @Description(shortDefinition = "Billing, service, product, or drug code", formalDefinition = "When the value is a group code then this item collects a set of related claim details, otherwise this contains the product, service, drug or other billing code for the item.")
6431    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/service-uscls")
6432    protected CodeableConcept productOrService;
6433
6434    /**
6435     * Item typification or modifiers codes to convey additional context for the
6436     * product or service.
6437     */
6438    @Child(name = "modifier", type = {
6439        CodeableConcept.class }, order = 5, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
6440    @Description(shortDefinition = "Service/Product billing modifiers", formalDefinition = "Item typification or modifiers codes to convey additional context for the product or service.")
6441    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/claim-modifiers")
6442    protected List<CodeableConcept> modifier;
6443
6444    /**
6445     * Identifies the program under which this may be recovered.
6446     */
6447    @Child(name = "programCode", type = {
6448        CodeableConcept.class }, order = 6, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
6449    @Description(shortDefinition = "Program the product or service is provided under", formalDefinition = "Identifies the program under which this may be recovered.")
6450    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/ex-program-code")
6451    protected List<CodeableConcept> programCode;
6452
6453    /**
6454     * The number of repetitions of a service or product.
6455     */
6456    @Child(name = "quantity", type = { Quantity.class }, order = 7, min = 0, max = 1, modifier = false, summary = false)
6457    @Description(shortDefinition = "Count of products or services", formalDefinition = "The number of repetitions of a service or product.")
6458    protected Quantity quantity;
6459
6460    /**
6461     * If the item is not a group then this is the fee for the product or service,
6462     * otherwise this is the total of the fees for the details of the group.
6463     */
6464    @Child(name = "unitPrice", type = { Money.class }, order = 8, min = 0, max = 1, modifier = false, summary = false)
6465    @Description(shortDefinition = "Fee, charge or cost per item", formalDefinition = "If the item is not a group then this is the fee for the product or service, otherwise this is the total of the fees for the details of the group.")
6466    protected Money unitPrice;
6467
6468    /**
6469     * A real number that represents a multiplier used in determining the overall
6470     * value of services delivered and/or goods received. The concept of a Factor
6471     * allows for a discount or surcharge multiplier to be applied to a monetary
6472     * amount.
6473     */
6474    @Child(name = "factor", type = {
6475        DecimalType.class }, order = 9, min = 0, max = 1, modifier = false, summary = false)
6476    @Description(shortDefinition = "Price scaling factor", formalDefinition = "A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.")
6477    protected DecimalType factor;
6478
6479    /**
6480     * The quantity times the unit price for an additional service or product or
6481     * charge.
6482     */
6483    @Child(name = "net", type = { Money.class }, order = 10, min = 0, max = 1, modifier = false, summary = false)
6484    @Description(shortDefinition = "Total item cost", formalDefinition = "The quantity times the unit price for an additional service or product or charge.")
6485    protected Money net;
6486
6487    /**
6488     * Unique Device Identifiers associated with this line item.
6489     */
6490    @Child(name = "udi", type = {
6491        Device.class }, order = 11, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
6492    @Description(shortDefinition = "Unique device identifier", formalDefinition = "Unique Device Identifiers associated with this line item.")
6493    protected List<Reference> udi;
6494    /**
6495     * The actual objects that are the target of the reference (Unique Device
6496     * Identifiers associated with this line item.)
6497     */
6498    protected List<Device> udiTarget;
6499
6500    /**
6501     * A claim detail line. Either a simple (a product or service) or a 'group' of
6502     * sub-details which are simple items.
6503     */
6504    @Child(name = "subDetail", type = {}, order = 12, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
6505    @Description(shortDefinition = "Product or service provided", formalDefinition = "A claim detail line. Either a simple (a product or service) or a 'group' of sub-details which are simple items.")
6506    protected List<SubDetailComponent> subDetail;
6507
6508    private static final long serialVersionUID = -1245004924L;
6509
6510    /**
6511     * Constructor
6512     */
6513    public DetailComponent() {
6514      super();
6515    }
6516
6517    /**
6518     * Constructor
6519     */
6520    public DetailComponent(PositiveIntType sequence, CodeableConcept productOrService) {
6521      super();
6522      this.sequence = sequence;
6523      this.productOrService = productOrService;
6524    }
6525
6526    /**
6527     * @return {@link #sequence} (A number to uniquely identify item entries.). This
6528     *         is the underlying object with id, value and extensions. The accessor
6529     *         "getSequence" gives direct access to the value
6530     */
6531    public PositiveIntType getSequenceElement() {
6532      if (this.sequence == null)
6533        if (Configuration.errorOnAutoCreate())
6534          throw new Error("Attempt to auto-create DetailComponent.sequence");
6535        else if (Configuration.doAutoCreate())
6536          this.sequence = new PositiveIntType(); // bb
6537      return this.sequence;
6538    }
6539
6540    public boolean hasSequenceElement() {
6541      return this.sequence != null && !this.sequence.isEmpty();
6542    }
6543
6544    public boolean hasSequence() {
6545      return this.sequence != null && !this.sequence.isEmpty();
6546    }
6547
6548    /**
6549     * @param value {@link #sequence} (A number to uniquely identify item entries.).
6550     *              This is the underlying object with id, value and extensions. The
6551     *              accessor "getSequence" gives direct access to the value
6552     */
6553    public DetailComponent setSequenceElement(PositiveIntType value) {
6554      this.sequence = value;
6555      return this;
6556    }
6557
6558    /**
6559     * @return A number to uniquely identify item entries.
6560     */
6561    public int getSequence() {
6562      return this.sequence == null || this.sequence.isEmpty() ? 0 : this.sequence.getValue();
6563    }
6564
6565    /**
6566     * @param value A number to uniquely identify item entries.
6567     */
6568    public DetailComponent setSequence(int value) {
6569      if (this.sequence == null)
6570        this.sequence = new PositiveIntType();
6571      this.sequence.setValue(value);
6572      return this;
6573    }
6574
6575    /**
6576     * @return {@link #revenue} (The type of revenue or cost center providing the
6577     *         product and/or service.)
6578     */
6579    public CodeableConcept getRevenue() {
6580      if (this.revenue == null)
6581        if (Configuration.errorOnAutoCreate())
6582          throw new Error("Attempt to auto-create DetailComponent.revenue");
6583        else if (Configuration.doAutoCreate())
6584          this.revenue = new CodeableConcept(); // cc
6585      return this.revenue;
6586    }
6587
6588    public boolean hasRevenue() {
6589      return this.revenue != null && !this.revenue.isEmpty();
6590    }
6591
6592    /**
6593     * @param value {@link #revenue} (The type of revenue or cost center providing
6594     *              the product and/or service.)
6595     */
6596    public DetailComponent setRevenue(CodeableConcept value) {
6597      this.revenue = value;
6598      return this;
6599    }
6600
6601    /**
6602     * @return {@link #category} (Code to identify the general type of benefits
6603     *         under which products and services are provided.)
6604     */
6605    public CodeableConcept getCategory() {
6606      if (this.category == null)
6607        if (Configuration.errorOnAutoCreate())
6608          throw new Error("Attempt to auto-create DetailComponent.category");
6609        else if (Configuration.doAutoCreate())
6610          this.category = new CodeableConcept(); // cc
6611      return this.category;
6612    }
6613
6614    public boolean hasCategory() {
6615      return this.category != null && !this.category.isEmpty();
6616    }
6617
6618    /**
6619     * @param value {@link #category} (Code to identify the general type of benefits
6620     *              under which products and services are provided.)
6621     */
6622    public DetailComponent setCategory(CodeableConcept value) {
6623      this.category = value;
6624      return this;
6625    }
6626
6627    /**
6628     * @return {@link #productOrService} (When the value is a group code then this
6629     *         item collects a set of related claim details, otherwise this contains
6630     *         the product, service, drug or other billing code for the item.)
6631     */
6632    public CodeableConcept getProductOrService() {
6633      if (this.productOrService == null)
6634        if (Configuration.errorOnAutoCreate())
6635          throw new Error("Attempt to auto-create DetailComponent.productOrService");
6636        else if (Configuration.doAutoCreate())
6637          this.productOrService = new CodeableConcept(); // cc
6638      return this.productOrService;
6639    }
6640
6641    public boolean hasProductOrService() {
6642      return this.productOrService != null && !this.productOrService.isEmpty();
6643    }
6644
6645    /**
6646     * @param value {@link #productOrService} (When the value is a group code then
6647     *              this item collects a set of related claim details, otherwise
6648     *              this contains the product, service, drug or other billing code
6649     *              for the item.)
6650     */
6651    public DetailComponent setProductOrService(CodeableConcept value) {
6652      this.productOrService = value;
6653      return this;
6654    }
6655
6656    /**
6657     * @return {@link #modifier} (Item typification or modifiers codes to convey
6658     *         additional context for the product or service.)
6659     */
6660    public List<CodeableConcept> getModifier() {
6661      if (this.modifier == null)
6662        this.modifier = new ArrayList<CodeableConcept>();
6663      return this.modifier;
6664    }
6665
6666    /**
6667     * @return Returns a reference to <code>this</code> for easy method chaining
6668     */
6669    public DetailComponent setModifier(List<CodeableConcept> theModifier) {
6670      this.modifier = theModifier;
6671      return this;
6672    }
6673
6674    public boolean hasModifier() {
6675      if (this.modifier == null)
6676        return false;
6677      for (CodeableConcept item : this.modifier)
6678        if (!item.isEmpty())
6679          return true;
6680      return false;
6681    }
6682
6683    public CodeableConcept addModifier() { // 3
6684      CodeableConcept t = new CodeableConcept();
6685      if (this.modifier == null)
6686        this.modifier = new ArrayList<CodeableConcept>();
6687      this.modifier.add(t);
6688      return t;
6689    }
6690
6691    public DetailComponent addModifier(CodeableConcept t) { // 3
6692      if (t == null)
6693        return this;
6694      if (this.modifier == null)
6695        this.modifier = new ArrayList<CodeableConcept>();
6696      this.modifier.add(t);
6697      return this;
6698    }
6699
6700    /**
6701     * @return The first repetition of repeating field {@link #modifier}, creating
6702     *         it if it does not already exist
6703     */
6704    public CodeableConcept getModifierFirstRep() {
6705      if (getModifier().isEmpty()) {
6706        addModifier();
6707      }
6708      return getModifier().get(0);
6709    }
6710
6711    /**
6712     * @return {@link #programCode} (Identifies the program under which this may be
6713     *         recovered.)
6714     */
6715    public List<CodeableConcept> getProgramCode() {
6716      if (this.programCode == null)
6717        this.programCode = new ArrayList<CodeableConcept>();
6718      return this.programCode;
6719    }
6720
6721    /**
6722     * @return Returns a reference to <code>this</code> for easy method chaining
6723     */
6724    public DetailComponent setProgramCode(List<CodeableConcept> theProgramCode) {
6725      this.programCode = theProgramCode;
6726      return this;
6727    }
6728
6729    public boolean hasProgramCode() {
6730      if (this.programCode == null)
6731        return false;
6732      for (CodeableConcept item : this.programCode)
6733        if (!item.isEmpty())
6734          return true;
6735      return false;
6736    }
6737
6738    public CodeableConcept addProgramCode() { // 3
6739      CodeableConcept t = new CodeableConcept();
6740      if (this.programCode == null)
6741        this.programCode = new ArrayList<CodeableConcept>();
6742      this.programCode.add(t);
6743      return t;
6744    }
6745
6746    public DetailComponent addProgramCode(CodeableConcept t) { // 3
6747      if (t == null)
6748        return this;
6749      if (this.programCode == null)
6750        this.programCode = new ArrayList<CodeableConcept>();
6751      this.programCode.add(t);
6752      return this;
6753    }
6754
6755    /**
6756     * @return The first repetition of repeating field {@link #programCode},
6757     *         creating it if it does not already exist
6758     */
6759    public CodeableConcept getProgramCodeFirstRep() {
6760      if (getProgramCode().isEmpty()) {
6761        addProgramCode();
6762      }
6763      return getProgramCode().get(0);
6764    }
6765
6766    /**
6767     * @return {@link #quantity} (The number of repetitions of a service or
6768     *         product.)
6769     */
6770    public Quantity getQuantity() {
6771      if (this.quantity == null)
6772        if (Configuration.errorOnAutoCreate())
6773          throw new Error("Attempt to auto-create DetailComponent.quantity");
6774        else if (Configuration.doAutoCreate())
6775          this.quantity = new Quantity(); // cc
6776      return this.quantity;
6777    }
6778
6779    public boolean hasQuantity() {
6780      return this.quantity != null && !this.quantity.isEmpty();
6781    }
6782
6783    /**
6784     * @param value {@link #quantity} (The number of repetitions of a service or
6785     *              product.)
6786     */
6787    public DetailComponent setQuantity(Quantity value) {
6788      this.quantity = value;
6789      return this;
6790    }
6791
6792    /**
6793     * @return {@link #unitPrice} (If the item is not a group then this is the fee
6794     *         for the product or service, otherwise this is the total of the fees
6795     *         for the details of the group.)
6796     */
6797    public Money getUnitPrice() {
6798      if (this.unitPrice == null)
6799        if (Configuration.errorOnAutoCreate())
6800          throw new Error("Attempt to auto-create DetailComponent.unitPrice");
6801        else if (Configuration.doAutoCreate())
6802          this.unitPrice = new Money(); // cc
6803      return this.unitPrice;
6804    }
6805
6806    public boolean hasUnitPrice() {
6807      return this.unitPrice != null && !this.unitPrice.isEmpty();
6808    }
6809
6810    /**
6811     * @param value {@link #unitPrice} (If the item is not a group then this is the
6812     *              fee for the product or service, otherwise this is the total of
6813     *              the fees for the details of the group.)
6814     */
6815    public DetailComponent setUnitPrice(Money value) {
6816      this.unitPrice = value;
6817      return this;
6818    }
6819
6820    /**
6821     * @return {@link #factor} (A real number that represents a multiplier used in
6822     *         determining the overall value of services delivered and/or goods
6823     *         received. The concept of a Factor allows for a discount or surcharge
6824     *         multiplier to be applied to a monetary amount.). This is the
6825     *         underlying object with id, value and extensions. The accessor
6826     *         "getFactor" gives direct access to the value
6827     */
6828    public DecimalType getFactorElement() {
6829      if (this.factor == null)
6830        if (Configuration.errorOnAutoCreate())
6831          throw new Error("Attempt to auto-create DetailComponent.factor");
6832        else if (Configuration.doAutoCreate())
6833          this.factor = new DecimalType(); // bb
6834      return this.factor;
6835    }
6836
6837    public boolean hasFactorElement() {
6838      return this.factor != null && !this.factor.isEmpty();
6839    }
6840
6841    public boolean hasFactor() {
6842      return this.factor != null && !this.factor.isEmpty();
6843    }
6844
6845    /**
6846     * @param value {@link #factor} (A real number that represents a multiplier used
6847     *              in determining the overall value of services delivered and/or
6848     *              goods received. The concept of a Factor allows for a discount or
6849     *              surcharge multiplier to be applied to a monetary amount.). This
6850     *              is the underlying object with id, value and extensions. The
6851     *              accessor "getFactor" gives direct access to the value
6852     */
6853    public DetailComponent setFactorElement(DecimalType value) {
6854      this.factor = value;
6855      return this;
6856    }
6857
6858    /**
6859     * @return A real number that represents a multiplier used in determining the
6860     *         overall value of services delivered and/or goods received. The
6861     *         concept of a Factor allows for a discount or surcharge multiplier to
6862     *         be applied to a monetary amount.
6863     */
6864    public BigDecimal getFactor() {
6865      return this.factor == null ? null : this.factor.getValue();
6866    }
6867
6868    /**
6869     * @param value A real number that represents a multiplier used in determining
6870     *              the overall value of services delivered and/or goods received.
6871     *              The concept of a Factor allows for a discount or surcharge
6872     *              multiplier to be applied to a monetary amount.
6873     */
6874    public DetailComponent setFactor(BigDecimal value) {
6875      if (value == null)
6876        this.factor = null;
6877      else {
6878        if (this.factor == null)
6879          this.factor = new DecimalType();
6880        this.factor.setValue(value);
6881      }
6882      return this;
6883    }
6884
6885    /**
6886     * @param value A real number that represents a multiplier used in determining
6887     *              the overall value of services delivered and/or goods received.
6888     *              The concept of a Factor allows for a discount or surcharge
6889     *              multiplier to be applied to a monetary amount.
6890     */
6891    public DetailComponent setFactor(long value) {
6892      this.factor = new DecimalType();
6893      this.factor.setValue(value);
6894      return this;
6895    }
6896
6897    /**
6898     * @param value A real number that represents a multiplier used in determining
6899     *              the overall value of services delivered and/or goods received.
6900     *              The concept of a Factor allows for a discount or surcharge
6901     *              multiplier to be applied to a monetary amount.
6902     */
6903    public DetailComponent setFactor(double value) {
6904      this.factor = new DecimalType();
6905      this.factor.setValue(value);
6906      return this;
6907    }
6908
6909    /**
6910     * @return {@link #net} (The quantity times the unit price for an additional
6911     *         service or product or charge.)
6912     */
6913    public Money getNet() {
6914      if (this.net == null)
6915        if (Configuration.errorOnAutoCreate())
6916          throw new Error("Attempt to auto-create DetailComponent.net");
6917        else if (Configuration.doAutoCreate())
6918          this.net = new Money(); // cc
6919      return this.net;
6920    }
6921
6922    public boolean hasNet() {
6923      return this.net != null && !this.net.isEmpty();
6924    }
6925
6926    /**
6927     * @param value {@link #net} (The quantity times the unit price for an
6928     *              additional service or product or charge.)
6929     */
6930    public DetailComponent setNet(Money value) {
6931      this.net = value;
6932      return this;
6933    }
6934
6935    /**
6936     * @return {@link #udi} (Unique Device Identifiers associated with this line
6937     *         item.)
6938     */
6939    public List<Reference> getUdi() {
6940      if (this.udi == null)
6941        this.udi = new ArrayList<Reference>();
6942      return this.udi;
6943    }
6944
6945    /**
6946     * @return Returns a reference to <code>this</code> for easy method chaining
6947     */
6948    public DetailComponent setUdi(List<Reference> theUdi) {
6949      this.udi = theUdi;
6950      return this;
6951    }
6952
6953    public boolean hasUdi() {
6954      if (this.udi == null)
6955        return false;
6956      for (Reference item : this.udi)
6957        if (!item.isEmpty())
6958          return true;
6959      return false;
6960    }
6961
6962    public Reference addUdi() { // 3
6963      Reference t = new Reference();
6964      if (this.udi == null)
6965        this.udi = new ArrayList<Reference>();
6966      this.udi.add(t);
6967      return t;
6968    }
6969
6970    public DetailComponent addUdi(Reference t) { // 3
6971      if (t == null)
6972        return this;
6973      if (this.udi == null)
6974        this.udi = new ArrayList<Reference>();
6975      this.udi.add(t);
6976      return this;
6977    }
6978
6979    /**
6980     * @return The first repetition of repeating field {@link #udi}, creating it if
6981     *         it does not already exist
6982     */
6983    public Reference getUdiFirstRep() {
6984      if (getUdi().isEmpty()) {
6985        addUdi();
6986      }
6987      return getUdi().get(0);
6988    }
6989
6990    /**
6991     * @deprecated Use Reference#setResource(IBaseResource) instead
6992     */
6993    @Deprecated
6994    public List<Device> getUdiTarget() {
6995      if (this.udiTarget == null)
6996        this.udiTarget = new ArrayList<Device>();
6997      return this.udiTarget;
6998    }
6999
7000    /**
7001     * @deprecated Use Reference#setResource(IBaseResource) instead
7002     */
7003    @Deprecated
7004    public Device addUdiTarget() {
7005      Device r = new Device();
7006      if (this.udiTarget == null)
7007        this.udiTarget = new ArrayList<Device>();
7008      this.udiTarget.add(r);
7009      return r;
7010    }
7011
7012    /**
7013     * @return {@link #subDetail} (A claim detail line. Either a simple (a product
7014     *         or service) or a 'group' of sub-details which are simple items.)
7015     */
7016    public List<SubDetailComponent> getSubDetail() {
7017      if (this.subDetail == null)
7018        this.subDetail = new ArrayList<SubDetailComponent>();
7019      return this.subDetail;
7020    }
7021
7022    /**
7023     * @return Returns a reference to <code>this</code> for easy method chaining
7024     */
7025    public DetailComponent setSubDetail(List<SubDetailComponent> theSubDetail) {
7026      this.subDetail = theSubDetail;
7027      return this;
7028    }
7029
7030    public boolean hasSubDetail() {
7031      if (this.subDetail == null)
7032        return false;
7033      for (SubDetailComponent item : this.subDetail)
7034        if (!item.isEmpty())
7035          return true;
7036      return false;
7037    }
7038
7039    public SubDetailComponent addSubDetail() { // 3
7040      SubDetailComponent t = new SubDetailComponent();
7041      if (this.subDetail == null)
7042        this.subDetail = new ArrayList<SubDetailComponent>();
7043      this.subDetail.add(t);
7044      return t;
7045    }
7046
7047    public DetailComponent addSubDetail(SubDetailComponent t) { // 3
7048      if (t == null)
7049        return this;
7050      if (this.subDetail == null)
7051        this.subDetail = new ArrayList<SubDetailComponent>();
7052      this.subDetail.add(t);
7053      return this;
7054    }
7055
7056    /**
7057     * @return The first repetition of repeating field {@link #subDetail}, creating
7058     *         it if it does not already exist
7059     */
7060    public SubDetailComponent getSubDetailFirstRep() {
7061      if (getSubDetail().isEmpty()) {
7062        addSubDetail();
7063      }
7064      return getSubDetail().get(0);
7065    }
7066
7067    protected void listChildren(List<Property> children) {
7068      super.listChildren(children);
7069      children
7070          .add(new Property("sequence", "positiveInt", "A number to uniquely identify item entries.", 0, 1, sequence));
7071      children.add(new Property("revenue", "CodeableConcept",
7072          "The type of revenue or cost center providing the product and/or service.", 0, 1, revenue));
7073      children.add(new Property("category", "CodeableConcept",
7074          "Code to identify the general type of benefits under which products and services are provided.", 0, 1,
7075          category));
7076      children.add(new Property("productOrService", "CodeableConcept",
7077          "When the value is a group code then this item collects a set of related claim details, otherwise this contains the product, service, drug or other billing code for the item.",
7078          0, 1, productOrService));
7079      children.add(new Property("modifier", "CodeableConcept",
7080          "Item typification or modifiers codes to convey additional context for the product or service.", 0,
7081          java.lang.Integer.MAX_VALUE, modifier));
7082      children.add(new Property("programCode", "CodeableConcept",
7083          "Identifies the program under which this may be recovered.", 0, java.lang.Integer.MAX_VALUE, programCode));
7084      children.add(new Property("quantity", "SimpleQuantity", "The number of repetitions of a service or product.", 0,
7085          1, quantity));
7086      children.add(new Property("unitPrice", "Money",
7087          "If the item is not a group then this is the fee for the product or service, otherwise this is the total of the fees for the details of the group.",
7088          0, 1, unitPrice));
7089      children.add(new Property("factor", "decimal",
7090          "A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.",
7091          0, 1, factor));
7092      children.add(new Property("net", "Money",
7093          "The quantity times the unit price for an additional service or product or charge.", 0, 1, net));
7094      children.add(new Property("udi", "Reference(Device)", "Unique Device Identifiers associated with this line item.",
7095          0, java.lang.Integer.MAX_VALUE, udi));
7096      children.add(new Property("subDetail", "",
7097          "A claim detail line. Either a simple (a product or service) or a 'group' of sub-details which are simple items.",
7098          0, java.lang.Integer.MAX_VALUE, subDetail));
7099    }
7100
7101    @Override
7102    public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
7103      switch (_hash) {
7104      case 1349547969:
7105        /* sequence */ return new Property("sequence", "positiveInt", "A number to uniquely identify item entries.", 0,
7106            1, sequence);
7107      case 1099842588:
7108        /* revenue */ return new Property("revenue", "CodeableConcept",
7109            "The type of revenue or cost center providing the product and/or service.", 0, 1, revenue);
7110      case 50511102:
7111        /* category */ return new Property("category", "CodeableConcept",
7112            "Code to identify the general type of benefits under which products and services are provided.", 0, 1,
7113            category);
7114      case 1957227299:
7115        /* productOrService */ return new Property("productOrService", "CodeableConcept",
7116            "When the value is a group code then this item collects a set of related claim details, otherwise this contains the product, service, drug or other billing code for the item.",
7117            0, 1, productOrService);
7118      case -615513385:
7119        /* modifier */ return new Property("modifier", "CodeableConcept",
7120            "Item typification or modifiers codes to convey additional context for the product or service.", 0,
7121            java.lang.Integer.MAX_VALUE, modifier);
7122      case 1010065041:
7123        /* programCode */ return new Property("programCode", "CodeableConcept",
7124            "Identifies the program under which this may be recovered.", 0, java.lang.Integer.MAX_VALUE, programCode);
7125      case -1285004149:
7126        /* quantity */ return new Property("quantity", "SimpleQuantity",
7127            "The number of repetitions of a service or product.", 0, 1, quantity);
7128      case -486196699:
7129        /* unitPrice */ return new Property("unitPrice", "Money",
7130            "If the item is not a group then this is the fee for the product or service, otherwise this is the total of the fees for the details of the group.",
7131            0, 1, unitPrice);
7132      case -1282148017:
7133        /* factor */ return new Property("factor", "decimal",
7134            "A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.",
7135            0, 1, factor);
7136      case 108957:
7137        /* net */ return new Property("net", "Money",
7138            "The quantity times the unit price for an additional service or product or charge.", 0, 1, net);
7139      case 115642:
7140        /* udi */ return new Property("udi", "Reference(Device)",
7141            "Unique Device Identifiers associated with this line item.", 0, java.lang.Integer.MAX_VALUE, udi);
7142      case -828829007:
7143        /* subDetail */ return new Property("subDetail", "",
7144            "A claim detail line. Either a simple (a product or service) or a 'group' of sub-details which are simple items.",
7145            0, java.lang.Integer.MAX_VALUE, subDetail);
7146      default:
7147        return super.getNamedProperty(_hash, _name, _checkValid);
7148      }
7149
7150    }
7151
7152    @Override
7153    public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
7154      switch (hash) {
7155      case 1349547969:
7156        /* sequence */ return this.sequence == null ? new Base[0] : new Base[] { this.sequence }; // PositiveIntType
7157      case 1099842588:
7158        /* revenue */ return this.revenue == null ? new Base[0] : new Base[] { this.revenue }; // CodeableConcept
7159      case 50511102:
7160        /* category */ return this.category == null ? new Base[0] : new Base[] { this.category }; // CodeableConcept
7161      case 1957227299:
7162        /* productOrService */ return this.productOrService == null ? new Base[0]
7163            : new Base[] { this.productOrService }; // CodeableConcept
7164      case -615513385:
7165        /* modifier */ return this.modifier == null ? new Base[0]
7166            : this.modifier.toArray(new Base[this.modifier.size()]); // CodeableConcept
7167      case 1010065041:
7168        /* programCode */ return this.programCode == null ? new Base[0]
7169            : this.programCode.toArray(new Base[this.programCode.size()]); // CodeableConcept
7170      case -1285004149:
7171        /* quantity */ return this.quantity == null ? new Base[0] : new Base[] { this.quantity }; // Quantity
7172      case -486196699:
7173        /* unitPrice */ return this.unitPrice == null ? new Base[0] : new Base[] { this.unitPrice }; // Money
7174      case -1282148017:
7175        /* factor */ return this.factor == null ? new Base[0] : new Base[] { this.factor }; // DecimalType
7176      case 108957:
7177        /* net */ return this.net == null ? new Base[0] : new Base[] { this.net }; // Money
7178      case 115642:
7179        /* udi */ return this.udi == null ? new Base[0] : this.udi.toArray(new Base[this.udi.size()]); // Reference
7180      case -828829007:
7181        /* subDetail */ return this.subDetail == null ? new Base[0]
7182            : this.subDetail.toArray(new Base[this.subDetail.size()]); // SubDetailComponent
7183      default:
7184        return super.getProperty(hash, name, checkValid);
7185      }
7186
7187    }
7188
7189    @Override
7190    public Base setProperty(int hash, String name, Base value) throws FHIRException {
7191      switch (hash) {
7192      case 1349547969: // sequence
7193        this.sequence = castToPositiveInt(value); // PositiveIntType
7194        return value;
7195      case 1099842588: // revenue
7196        this.revenue = castToCodeableConcept(value); // CodeableConcept
7197        return value;
7198      case 50511102: // category
7199        this.category = castToCodeableConcept(value); // CodeableConcept
7200        return value;
7201      case 1957227299: // productOrService
7202        this.productOrService = castToCodeableConcept(value); // CodeableConcept
7203        return value;
7204      case -615513385: // modifier
7205        this.getModifier().add(castToCodeableConcept(value)); // CodeableConcept
7206        return value;
7207      case 1010065041: // programCode
7208        this.getProgramCode().add(castToCodeableConcept(value)); // CodeableConcept
7209        return value;
7210      case -1285004149: // quantity
7211        this.quantity = castToQuantity(value); // Quantity
7212        return value;
7213      case -486196699: // unitPrice
7214        this.unitPrice = castToMoney(value); // Money
7215        return value;
7216      case -1282148017: // factor
7217        this.factor = castToDecimal(value); // DecimalType
7218        return value;
7219      case 108957: // net
7220        this.net = castToMoney(value); // Money
7221        return value;
7222      case 115642: // udi
7223        this.getUdi().add(castToReference(value)); // Reference
7224        return value;
7225      case -828829007: // subDetail
7226        this.getSubDetail().add((SubDetailComponent) value); // SubDetailComponent
7227        return value;
7228      default:
7229        return super.setProperty(hash, name, value);
7230      }
7231
7232    }
7233
7234    @Override
7235    public Base setProperty(String name, Base value) throws FHIRException {
7236      if (name.equals("sequence")) {
7237        this.sequence = castToPositiveInt(value); // PositiveIntType
7238      } else if (name.equals("revenue")) {
7239        this.revenue = castToCodeableConcept(value); // CodeableConcept
7240      } else if (name.equals("category")) {
7241        this.category = castToCodeableConcept(value); // CodeableConcept
7242      } else if (name.equals("productOrService")) {
7243        this.productOrService = castToCodeableConcept(value); // CodeableConcept
7244      } else if (name.equals("modifier")) {
7245        this.getModifier().add(castToCodeableConcept(value));
7246      } else if (name.equals("programCode")) {
7247        this.getProgramCode().add(castToCodeableConcept(value));
7248      } else if (name.equals("quantity")) {
7249        this.quantity = castToQuantity(value); // Quantity
7250      } else if (name.equals("unitPrice")) {
7251        this.unitPrice = castToMoney(value); // Money
7252      } else if (name.equals("factor")) {
7253        this.factor = castToDecimal(value); // DecimalType
7254      } else if (name.equals("net")) {
7255        this.net = castToMoney(value); // Money
7256      } else if (name.equals("udi")) {
7257        this.getUdi().add(castToReference(value));
7258      } else if (name.equals("subDetail")) {
7259        this.getSubDetail().add((SubDetailComponent) value);
7260      } else
7261        return super.setProperty(name, value);
7262      return value;
7263    }
7264
7265  @Override
7266  public void removeChild(String name, Base value) throws FHIRException {
7267      if (name.equals("sequence")) {
7268        this.sequence = null;
7269      } else if (name.equals("revenue")) {
7270        this.revenue = null;
7271      } else if (name.equals("category")) {
7272        this.category = null;
7273      } else if (name.equals("productOrService")) {
7274        this.productOrService = null;
7275      } else if (name.equals("modifier")) {
7276        this.getModifier().remove(castToCodeableConcept(value));
7277      } else if (name.equals("programCode")) {
7278        this.getProgramCode().remove(castToCodeableConcept(value));
7279      } else if (name.equals("quantity")) {
7280        this.quantity = null;
7281      } else if (name.equals("unitPrice")) {
7282        this.unitPrice = null;
7283      } else if (name.equals("factor")) {
7284        this.factor = null;
7285      } else if (name.equals("net")) {
7286        this.net = null;
7287      } else if (name.equals("udi")) {
7288        this.getUdi().remove(castToReference(value));
7289      } else if (name.equals("subDetail")) {
7290        this.getSubDetail().remove((SubDetailComponent) value);
7291      } else
7292        super.removeChild(name, value);
7293      
7294    }
7295
7296    @Override
7297    public Base makeProperty(int hash, String name) throws FHIRException {
7298      switch (hash) {
7299      case 1349547969:
7300        return getSequenceElement();
7301      case 1099842588:
7302        return getRevenue();
7303      case 50511102:
7304        return getCategory();
7305      case 1957227299:
7306        return getProductOrService();
7307      case -615513385:
7308        return addModifier();
7309      case 1010065041:
7310        return addProgramCode();
7311      case -1285004149:
7312        return getQuantity();
7313      case -486196699:
7314        return getUnitPrice();
7315      case -1282148017:
7316        return getFactorElement();
7317      case 108957:
7318        return getNet();
7319      case 115642:
7320        return addUdi();
7321      case -828829007:
7322        return addSubDetail();
7323      default:
7324        return super.makeProperty(hash, name);
7325      }
7326
7327    }
7328
7329    @Override
7330    public String[] getTypesForProperty(int hash, String name) throws FHIRException {
7331      switch (hash) {
7332      case 1349547969:
7333        /* sequence */ return new String[] { "positiveInt" };
7334      case 1099842588:
7335        /* revenue */ return new String[] { "CodeableConcept" };
7336      case 50511102:
7337        /* category */ return new String[] { "CodeableConcept" };
7338      case 1957227299:
7339        /* productOrService */ return new String[] { "CodeableConcept" };
7340      case -615513385:
7341        /* modifier */ return new String[] { "CodeableConcept" };
7342      case 1010065041:
7343        /* programCode */ return new String[] { "CodeableConcept" };
7344      case -1285004149:
7345        /* quantity */ return new String[] { "SimpleQuantity" };
7346      case -486196699:
7347        /* unitPrice */ return new String[] { "Money" };
7348      case -1282148017:
7349        /* factor */ return new String[] { "decimal" };
7350      case 108957:
7351        /* net */ return new String[] { "Money" };
7352      case 115642:
7353        /* udi */ return new String[] { "Reference" };
7354      case -828829007:
7355        /* subDetail */ return new String[] {};
7356      default:
7357        return super.getTypesForProperty(hash, name);
7358      }
7359
7360    }
7361
7362    @Override
7363    public Base addChild(String name) throws FHIRException {
7364      if (name.equals("sequence")) {
7365        throw new FHIRException("Cannot call addChild on a singleton property Claim.sequence");
7366      } else if (name.equals("revenue")) {
7367        this.revenue = new CodeableConcept();
7368        return this.revenue;
7369      } else if (name.equals("category")) {
7370        this.category = new CodeableConcept();
7371        return this.category;
7372      } else if (name.equals("productOrService")) {
7373        this.productOrService = new CodeableConcept();
7374        return this.productOrService;
7375      } else if (name.equals("modifier")) {
7376        return addModifier();
7377      } else if (name.equals("programCode")) {
7378        return addProgramCode();
7379      } else if (name.equals("quantity")) {
7380        this.quantity = new Quantity();
7381        return this.quantity;
7382      } else if (name.equals("unitPrice")) {
7383        this.unitPrice = new Money();
7384        return this.unitPrice;
7385      } else if (name.equals("factor")) {
7386        throw new FHIRException("Cannot call addChild on a singleton property Claim.factor");
7387      } else if (name.equals("net")) {
7388        this.net = new Money();
7389        return this.net;
7390      } else if (name.equals("udi")) {
7391        return addUdi();
7392      } else if (name.equals("subDetail")) {
7393        return addSubDetail();
7394      } else
7395        return super.addChild(name);
7396    }
7397
7398    public DetailComponent copy() {
7399      DetailComponent dst = new DetailComponent();
7400      copyValues(dst);
7401      return dst;
7402    }
7403
7404    public void copyValues(DetailComponent dst) {
7405      super.copyValues(dst);
7406      dst.sequence = sequence == null ? null : sequence.copy();
7407      dst.revenue = revenue == null ? null : revenue.copy();
7408      dst.category = category == null ? null : category.copy();
7409      dst.productOrService = productOrService == null ? null : productOrService.copy();
7410      if (modifier != null) {
7411        dst.modifier = new ArrayList<CodeableConcept>();
7412        for (CodeableConcept i : modifier)
7413          dst.modifier.add(i.copy());
7414      }
7415      ;
7416      if (programCode != null) {
7417        dst.programCode = new ArrayList<CodeableConcept>();
7418        for (CodeableConcept i : programCode)
7419          dst.programCode.add(i.copy());
7420      }
7421      ;
7422      dst.quantity = quantity == null ? null : quantity.copy();
7423      dst.unitPrice = unitPrice == null ? null : unitPrice.copy();
7424      dst.factor = factor == null ? null : factor.copy();
7425      dst.net = net == null ? null : net.copy();
7426      if (udi != null) {
7427        dst.udi = new ArrayList<Reference>();
7428        for (Reference i : udi)
7429          dst.udi.add(i.copy());
7430      }
7431      ;
7432      if (subDetail != null) {
7433        dst.subDetail = new ArrayList<SubDetailComponent>();
7434        for (SubDetailComponent i : subDetail)
7435          dst.subDetail.add(i.copy());
7436      }
7437      ;
7438    }
7439
7440    @Override
7441    public boolean equalsDeep(Base other_) {
7442      if (!super.equalsDeep(other_))
7443        return false;
7444      if (!(other_ instanceof DetailComponent))
7445        return false;
7446      DetailComponent o = (DetailComponent) other_;
7447      return compareDeep(sequence, o.sequence, true) && compareDeep(revenue, o.revenue, true)
7448          && compareDeep(category, o.category, true) && compareDeep(productOrService, o.productOrService, true)
7449          && compareDeep(modifier, o.modifier, true) && compareDeep(programCode, o.programCode, true)
7450          && compareDeep(quantity, o.quantity, true) && compareDeep(unitPrice, o.unitPrice, true)
7451          && compareDeep(factor, o.factor, true) && compareDeep(net, o.net, true) && compareDeep(udi, o.udi, true)
7452          && compareDeep(subDetail, o.subDetail, true);
7453    }
7454
7455    @Override
7456    public boolean equalsShallow(Base other_) {
7457      if (!super.equalsShallow(other_))
7458        return false;
7459      if (!(other_ instanceof DetailComponent))
7460        return false;
7461      DetailComponent o = (DetailComponent) other_;
7462      return compareValues(sequence, o.sequence, true) && compareValues(factor, o.factor, true);
7463    }
7464
7465    public boolean isEmpty() {
7466      return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(sequence, revenue, category, productOrService,
7467          modifier, programCode, quantity, unitPrice, factor, net, udi, subDetail);
7468    }
7469
7470    public String fhirType() {
7471      return "Claim.item.detail";
7472
7473    }
7474
7475  }
7476
7477  @Block()
7478  public static class SubDetailComponent extends BackboneElement implements IBaseBackboneElement {
7479    /**
7480     * A number to uniquely identify item entries.
7481     */
7482    @Child(name = "sequence", type = {
7483        PositiveIntType.class }, order = 1, min = 1, max = 1, modifier = false, summary = false)
7484    @Description(shortDefinition = "Item instance identifier", formalDefinition = "A number to uniquely identify item entries.")
7485    protected PositiveIntType sequence;
7486
7487    /**
7488     * The type of revenue or cost center providing the product and/or service.
7489     */
7490    @Child(name = "revenue", type = {
7491        CodeableConcept.class }, order = 2, min = 0, max = 1, modifier = false, summary = false)
7492    @Description(shortDefinition = "Revenue or cost center code", formalDefinition = "The type of revenue or cost center providing the product and/or service.")
7493    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/ex-revenue-center")
7494    protected CodeableConcept revenue;
7495
7496    /**
7497     * Code to identify the general type of benefits under which products and
7498     * services are provided.
7499     */
7500    @Child(name = "category", type = {
7501        CodeableConcept.class }, order = 3, min = 0, max = 1, modifier = false, summary = false)
7502    @Description(shortDefinition = "Benefit classification", formalDefinition = "Code to identify the general type of benefits under which products and services are provided.")
7503    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/ex-benefitcategory")
7504    protected CodeableConcept category;
7505
7506    /**
7507     * When the value is a group code then this item collects a set of related claim
7508     * details, otherwise this contains the product, service, drug or other billing
7509     * code for the item.
7510     */
7511    @Child(name = "productOrService", type = {
7512        CodeableConcept.class }, order = 4, min = 1, max = 1, modifier = false, summary = false)
7513    @Description(shortDefinition = "Billing, service, product, or drug code", formalDefinition = "When the value is a group code then this item collects a set of related claim details, otherwise this contains the product, service, drug or other billing code for the item.")
7514    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/service-uscls")
7515    protected CodeableConcept productOrService;
7516
7517    /**
7518     * Item typification or modifiers codes to convey additional context for the
7519     * product or service.
7520     */
7521    @Child(name = "modifier", type = {
7522        CodeableConcept.class }, order = 5, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
7523    @Description(shortDefinition = "Service/Product billing modifiers", formalDefinition = "Item typification or modifiers codes to convey additional context for the product or service.")
7524    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/claim-modifiers")
7525    protected List<CodeableConcept> modifier;
7526
7527    /**
7528     * Identifies the program under which this may be recovered.
7529     */
7530    @Child(name = "programCode", type = {
7531        CodeableConcept.class }, order = 6, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
7532    @Description(shortDefinition = "Program the product or service is provided under", formalDefinition = "Identifies the program under which this may be recovered.")
7533    @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/ex-program-code")
7534    protected List<CodeableConcept> programCode;
7535
7536    /**
7537     * The number of repetitions of a service or product.
7538     */
7539    @Child(name = "quantity", type = { Quantity.class }, order = 7, min = 0, max = 1, modifier = false, summary = false)
7540    @Description(shortDefinition = "Count of products or services", formalDefinition = "The number of repetitions of a service or product.")
7541    protected Quantity quantity;
7542
7543    /**
7544     * If the item is not a group then this is the fee for the product or service,
7545     * otherwise this is the total of the fees for the details of the group.
7546     */
7547    @Child(name = "unitPrice", type = { Money.class }, order = 8, min = 0, max = 1, modifier = false, summary = false)
7548    @Description(shortDefinition = "Fee, charge or cost per item", formalDefinition = "If the item is not a group then this is the fee for the product or service, otherwise this is the total of the fees for the details of the group.")
7549    protected Money unitPrice;
7550
7551    /**
7552     * A real number that represents a multiplier used in determining the overall
7553     * value of services delivered and/or goods received. The concept of a Factor
7554     * allows for a discount or surcharge multiplier to be applied to a monetary
7555     * amount.
7556     */
7557    @Child(name = "factor", type = {
7558        DecimalType.class }, order = 9, min = 0, max = 1, modifier = false, summary = false)
7559    @Description(shortDefinition = "Price scaling factor", formalDefinition = "A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.")
7560    protected DecimalType factor;
7561
7562    /**
7563     * The quantity times the unit price for an additional service or product or
7564     * charge.
7565     */
7566    @Child(name = "net", type = { Money.class }, order = 10, min = 0, max = 1, modifier = false, summary = false)
7567    @Description(shortDefinition = "Total item cost", formalDefinition = "The quantity times the unit price for an additional service or product or charge.")
7568    protected Money net;
7569
7570    /**
7571     * Unique Device Identifiers associated with this line item.
7572     */
7573    @Child(name = "udi", type = {
7574        Device.class }, order = 11, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
7575    @Description(shortDefinition = "Unique device identifier", formalDefinition = "Unique Device Identifiers associated with this line item.")
7576    protected List<Reference> udi;
7577    /**
7578     * The actual objects that are the target of the reference (Unique Device
7579     * Identifiers associated with this line item.)
7580     */
7581    protected List<Device> udiTarget;
7582
7583    private static final long serialVersionUID = 1133026301L;
7584
7585    /**
7586     * Constructor
7587     */
7588    public SubDetailComponent() {
7589      super();
7590    }
7591
7592    /**
7593     * Constructor
7594     */
7595    public SubDetailComponent(PositiveIntType sequence, CodeableConcept productOrService) {
7596      super();
7597      this.sequence = sequence;
7598      this.productOrService = productOrService;
7599    }
7600
7601    /**
7602     * @return {@link #sequence} (A number to uniquely identify item entries.). This
7603     *         is the underlying object with id, value and extensions. The accessor
7604     *         "getSequence" gives direct access to the value
7605     */
7606    public PositiveIntType getSequenceElement() {
7607      if (this.sequence == null)
7608        if (Configuration.errorOnAutoCreate())
7609          throw new Error("Attempt to auto-create SubDetailComponent.sequence");
7610        else if (Configuration.doAutoCreate())
7611          this.sequence = new PositiveIntType(); // bb
7612      return this.sequence;
7613    }
7614
7615    public boolean hasSequenceElement() {
7616      return this.sequence != null && !this.sequence.isEmpty();
7617    }
7618
7619    public boolean hasSequence() {
7620      return this.sequence != null && !this.sequence.isEmpty();
7621    }
7622
7623    /**
7624     * @param value {@link #sequence} (A number to uniquely identify item entries.).
7625     *              This is the underlying object with id, value and extensions. The
7626     *              accessor "getSequence" gives direct access to the value
7627     */
7628    public SubDetailComponent setSequenceElement(PositiveIntType value) {
7629      this.sequence = value;
7630      return this;
7631    }
7632
7633    /**
7634     * @return A number to uniquely identify item entries.
7635     */
7636    public int getSequence() {
7637      return this.sequence == null || this.sequence.isEmpty() ? 0 : this.sequence.getValue();
7638    }
7639
7640    /**
7641     * @param value A number to uniquely identify item entries.
7642     */
7643    public SubDetailComponent setSequence(int value) {
7644      if (this.sequence == null)
7645        this.sequence = new PositiveIntType();
7646      this.sequence.setValue(value);
7647      return this;
7648    }
7649
7650    /**
7651     * @return {@link #revenue} (The type of revenue or cost center providing the
7652     *         product and/or service.)
7653     */
7654    public CodeableConcept getRevenue() {
7655      if (this.revenue == null)
7656        if (Configuration.errorOnAutoCreate())
7657          throw new Error("Attempt to auto-create SubDetailComponent.revenue");
7658        else if (Configuration.doAutoCreate())
7659          this.revenue = new CodeableConcept(); // cc
7660      return this.revenue;
7661    }
7662
7663    public boolean hasRevenue() {
7664      return this.revenue != null && !this.revenue.isEmpty();
7665    }
7666
7667    /**
7668     * @param value {@link #revenue} (The type of revenue or cost center providing
7669     *              the product and/or service.)
7670     */
7671    public SubDetailComponent setRevenue(CodeableConcept value) {
7672      this.revenue = value;
7673      return this;
7674    }
7675
7676    /**
7677     * @return {@link #category} (Code to identify the general type of benefits
7678     *         under which products and services are provided.)
7679     */
7680    public CodeableConcept getCategory() {
7681      if (this.category == null)
7682        if (Configuration.errorOnAutoCreate())
7683          throw new Error("Attempt to auto-create SubDetailComponent.category");
7684        else if (Configuration.doAutoCreate())
7685          this.category = new CodeableConcept(); // cc
7686      return this.category;
7687    }
7688
7689    public boolean hasCategory() {
7690      return this.category != null && !this.category.isEmpty();
7691    }
7692
7693    /**
7694     * @param value {@link #category} (Code to identify the general type of benefits
7695     *              under which products and services are provided.)
7696     */
7697    public SubDetailComponent setCategory(CodeableConcept value) {
7698      this.category = value;
7699      return this;
7700    }
7701
7702    /**
7703     * @return {@link #productOrService} (When the value is a group code then this
7704     *         item collects a set of related claim details, otherwise this contains
7705     *         the product, service, drug or other billing code for the item.)
7706     */
7707    public CodeableConcept getProductOrService() {
7708      if (this.productOrService == null)
7709        if (Configuration.errorOnAutoCreate())
7710          throw new Error("Attempt to auto-create SubDetailComponent.productOrService");
7711        else if (Configuration.doAutoCreate())
7712          this.productOrService = new CodeableConcept(); // cc
7713      return this.productOrService;
7714    }
7715
7716    public boolean hasProductOrService() {
7717      return this.productOrService != null && !this.productOrService.isEmpty();
7718    }
7719
7720    /**
7721     * @param value {@link #productOrService} (When the value is a group code then
7722     *              this item collects a set of related claim details, otherwise
7723     *              this contains the product, service, drug or other billing code
7724     *              for the item.)
7725     */
7726    public SubDetailComponent setProductOrService(CodeableConcept value) {
7727      this.productOrService = value;
7728      return this;
7729    }
7730
7731    /**
7732     * @return {@link #modifier} (Item typification or modifiers codes to convey
7733     *         additional context for the product or service.)
7734     */
7735    public List<CodeableConcept> getModifier() {
7736      if (this.modifier == null)
7737        this.modifier = new ArrayList<CodeableConcept>();
7738      return this.modifier;
7739    }
7740
7741    /**
7742     * @return Returns a reference to <code>this</code> for easy method chaining
7743     */
7744    public SubDetailComponent setModifier(List<CodeableConcept> theModifier) {
7745      this.modifier = theModifier;
7746      return this;
7747    }
7748
7749    public boolean hasModifier() {
7750      if (this.modifier == null)
7751        return false;
7752      for (CodeableConcept item : this.modifier)
7753        if (!item.isEmpty())
7754          return true;
7755      return false;
7756    }
7757
7758    public CodeableConcept addModifier() { // 3
7759      CodeableConcept t = new CodeableConcept();
7760      if (this.modifier == null)
7761        this.modifier = new ArrayList<CodeableConcept>();
7762      this.modifier.add(t);
7763      return t;
7764    }
7765
7766    public SubDetailComponent addModifier(CodeableConcept t) { // 3
7767      if (t == null)
7768        return this;
7769      if (this.modifier == null)
7770        this.modifier = new ArrayList<CodeableConcept>();
7771      this.modifier.add(t);
7772      return this;
7773    }
7774
7775    /**
7776     * @return The first repetition of repeating field {@link #modifier}, creating
7777     *         it if it does not already exist
7778     */
7779    public CodeableConcept getModifierFirstRep() {
7780      if (getModifier().isEmpty()) {
7781        addModifier();
7782      }
7783      return getModifier().get(0);
7784    }
7785
7786    /**
7787     * @return {@link #programCode} (Identifies the program under which this may be
7788     *         recovered.)
7789     */
7790    public List<CodeableConcept> getProgramCode() {
7791      if (this.programCode == null)
7792        this.programCode = new ArrayList<CodeableConcept>();
7793      return this.programCode;
7794    }
7795
7796    /**
7797     * @return Returns a reference to <code>this</code> for easy method chaining
7798     */
7799    public SubDetailComponent setProgramCode(List<CodeableConcept> theProgramCode) {
7800      this.programCode = theProgramCode;
7801      return this;
7802    }
7803
7804    public boolean hasProgramCode() {
7805      if (this.programCode == null)
7806        return false;
7807      for (CodeableConcept item : this.programCode)
7808        if (!item.isEmpty())
7809          return true;
7810      return false;
7811    }
7812
7813    public CodeableConcept addProgramCode() { // 3
7814      CodeableConcept t = new CodeableConcept();
7815      if (this.programCode == null)
7816        this.programCode = new ArrayList<CodeableConcept>();
7817      this.programCode.add(t);
7818      return t;
7819    }
7820
7821    public SubDetailComponent addProgramCode(CodeableConcept t) { // 3
7822      if (t == null)
7823        return this;
7824      if (this.programCode == null)
7825        this.programCode = new ArrayList<CodeableConcept>();
7826      this.programCode.add(t);
7827      return this;
7828    }
7829
7830    /**
7831     * @return The first repetition of repeating field {@link #programCode},
7832     *         creating it if it does not already exist
7833     */
7834    public CodeableConcept getProgramCodeFirstRep() {
7835      if (getProgramCode().isEmpty()) {
7836        addProgramCode();
7837      }
7838      return getProgramCode().get(0);
7839    }
7840
7841    /**
7842     * @return {@link #quantity} (The number of repetitions of a service or
7843     *         product.)
7844     */
7845    public Quantity getQuantity() {
7846      if (this.quantity == null)
7847        if (Configuration.errorOnAutoCreate())
7848          throw new Error("Attempt to auto-create SubDetailComponent.quantity");
7849        else if (Configuration.doAutoCreate())
7850          this.quantity = new Quantity(); // cc
7851      return this.quantity;
7852    }
7853
7854    public boolean hasQuantity() {
7855      return this.quantity != null && !this.quantity.isEmpty();
7856    }
7857
7858    /**
7859     * @param value {@link #quantity} (The number of repetitions of a service or
7860     *              product.)
7861     */
7862    public SubDetailComponent setQuantity(Quantity value) {
7863      this.quantity = value;
7864      return this;
7865    }
7866
7867    /**
7868     * @return {@link #unitPrice} (If the item is not a group then this is the fee
7869     *         for the product or service, otherwise this is the total of the fees
7870     *         for the details of the group.)
7871     */
7872    public Money getUnitPrice() {
7873      if (this.unitPrice == null)
7874        if (Configuration.errorOnAutoCreate())
7875          throw new Error("Attempt to auto-create SubDetailComponent.unitPrice");
7876        else if (Configuration.doAutoCreate())
7877          this.unitPrice = new Money(); // cc
7878      return this.unitPrice;
7879    }
7880
7881    public boolean hasUnitPrice() {
7882      return this.unitPrice != null && !this.unitPrice.isEmpty();
7883    }
7884
7885    /**
7886     * @param value {@link #unitPrice} (If the item is not a group then this is the
7887     *              fee for the product or service, otherwise this is the total of
7888     *              the fees for the details of the group.)
7889     */
7890    public SubDetailComponent setUnitPrice(Money value) {
7891      this.unitPrice = value;
7892      return this;
7893    }
7894
7895    /**
7896     * @return {@link #factor} (A real number that represents a multiplier used in
7897     *         determining the overall value of services delivered and/or goods
7898     *         received. The concept of a Factor allows for a discount or surcharge
7899     *         multiplier to be applied to a monetary amount.). This is the
7900     *         underlying object with id, value and extensions. The accessor
7901     *         "getFactor" gives direct access to the value
7902     */
7903    public DecimalType getFactorElement() {
7904      if (this.factor == null)
7905        if (Configuration.errorOnAutoCreate())
7906          throw new Error("Attempt to auto-create SubDetailComponent.factor");
7907        else if (Configuration.doAutoCreate())
7908          this.factor = new DecimalType(); // bb
7909      return this.factor;
7910    }
7911
7912    public boolean hasFactorElement() {
7913      return this.factor != null && !this.factor.isEmpty();
7914    }
7915
7916    public boolean hasFactor() {
7917      return this.factor != null && !this.factor.isEmpty();
7918    }
7919
7920    /**
7921     * @param value {@link #factor} (A real number that represents a multiplier used
7922     *              in determining the overall value of services delivered and/or
7923     *              goods received. The concept of a Factor allows for a discount or
7924     *              surcharge multiplier to be applied to a monetary amount.). This
7925     *              is the underlying object with id, value and extensions. The
7926     *              accessor "getFactor" gives direct access to the value
7927     */
7928    public SubDetailComponent setFactorElement(DecimalType value) {
7929      this.factor = value;
7930      return this;
7931    }
7932
7933    /**
7934     * @return A real number that represents a multiplier used in determining the
7935     *         overall value of services delivered and/or goods received. The
7936     *         concept of a Factor allows for a discount or surcharge multiplier to
7937     *         be applied to a monetary amount.
7938     */
7939    public BigDecimal getFactor() {
7940      return this.factor == null ? null : this.factor.getValue();
7941    }
7942
7943    /**
7944     * @param value A real number that represents a multiplier used in determining
7945     *              the overall value of services delivered and/or goods received.
7946     *              The concept of a Factor allows for a discount or surcharge
7947     *              multiplier to be applied to a monetary amount.
7948     */
7949    public SubDetailComponent setFactor(BigDecimal value) {
7950      if (value == null)
7951        this.factor = null;
7952      else {
7953        if (this.factor == null)
7954          this.factor = new DecimalType();
7955        this.factor.setValue(value);
7956      }
7957      return this;
7958    }
7959
7960    /**
7961     * @param value A real number that represents a multiplier used in determining
7962     *              the overall value of services delivered and/or goods received.
7963     *              The concept of a Factor allows for a discount or surcharge
7964     *              multiplier to be applied to a monetary amount.
7965     */
7966    public SubDetailComponent setFactor(long value) {
7967      this.factor = new DecimalType();
7968      this.factor.setValue(value);
7969      return this;
7970    }
7971
7972    /**
7973     * @param value A real number that represents a multiplier used in determining
7974     *              the overall value of services delivered and/or goods received.
7975     *              The concept of a Factor allows for a discount or surcharge
7976     *              multiplier to be applied to a monetary amount.
7977     */
7978    public SubDetailComponent setFactor(double value) {
7979      this.factor = new DecimalType();
7980      this.factor.setValue(value);
7981      return this;
7982    }
7983
7984    /**
7985     * @return {@link #net} (The quantity times the unit price for an additional
7986     *         service or product or charge.)
7987     */
7988    public Money getNet() {
7989      if (this.net == null)
7990        if (Configuration.errorOnAutoCreate())
7991          throw new Error("Attempt to auto-create SubDetailComponent.net");
7992        else if (Configuration.doAutoCreate())
7993          this.net = new Money(); // cc
7994      return this.net;
7995    }
7996
7997    public boolean hasNet() {
7998      return this.net != null && !this.net.isEmpty();
7999    }
8000
8001    /**
8002     * @param value {@link #net} (The quantity times the unit price for an
8003     *              additional service or product or charge.)
8004     */
8005    public SubDetailComponent setNet(Money value) {
8006      this.net = value;
8007      return this;
8008    }
8009
8010    /**
8011     * @return {@link #udi} (Unique Device Identifiers associated with this line
8012     *         item.)
8013     */
8014    public List<Reference> getUdi() {
8015      if (this.udi == null)
8016        this.udi = new ArrayList<Reference>();
8017      return this.udi;
8018    }
8019
8020    /**
8021     * @return Returns a reference to <code>this</code> for easy method chaining
8022     */
8023    public SubDetailComponent setUdi(List<Reference> theUdi) {
8024      this.udi = theUdi;
8025      return this;
8026    }
8027
8028    public boolean hasUdi() {
8029      if (this.udi == null)
8030        return false;
8031      for (Reference item : this.udi)
8032        if (!item.isEmpty())
8033          return true;
8034      return false;
8035    }
8036
8037    public Reference addUdi() { // 3
8038      Reference t = new Reference();
8039      if (this.udi == null)
8040        this.udi = new ArrayList<Reference>();
8041      this.udi.add(t);
8042      return t;
8043    }
8044
8045    public SubDetailComponent addUdi(Reference t) { // 3
8046      if (t == null)
8047        return this;
8048      if (this.udi == null)
8049        this.udi = new ArrayList<Reference>();
8050      this.udi.add(t);
8051      return this;
8052    }
8053
8054    /**
8055     * @return The first repetition of repeating field {@link #udi}, creating it if
8056     *         it does not already exist
8057     */
8058    public Reference getUdiFirstRep() {
8059      if (getUdi().isEmpty()) {
8060        addUdi();
8061      }
8062      return getUdi().get(0);
8063    }
8064
8065    /**
8066     * @deprecated Use Reference#setResource(IBaseResource) instead
8067     */
8068    @Deprecated
8069    public List<Device> getUdiTarget() {
8070      if (this.udiTarget == null)
8071        this.udiTarget = new ArrayList<Device>();
8072      return this.udiTarget;
8073    }
8074
8075    /**
8076     * @deprecated Use Reference#setResource(IBaseResource) instead
8077     */
8078    @Deprecated
8079    public Device addUdiTarget() {
8080      Device r = new Device();
8081      if (this.udiTarget == null)
8082        this.udiTarget = new ArrayList<Device>();
8083      this.udiTarget.add(r);
8084      return r;
8085    }
8086
8087    protected void listChildren(List<Property> children) {
8088      super.listChildren(children);
8089      children
8090          .add(new Property("sequence", "positiveInt", "A number to uniquely identify item entries.", 0, 1, sequence));
8091      children.add(new Property("revenue", "CodeableConcept",
8092          "The type of revenue or cost center providing the product and/or service.", 0, 1, revenue));
8093      children.add(new Property("category", "CodeableConcept",
8094          "Code to identify the general type of benefits under which products and services are provided.", 0, 1,
8095          category));
8096      children.add(new Property("productOrService", "CodeableConcept",
8097          "When the value is a group code then this item collects a set of related claim details, otherwise this contains the product, service, drug or other billing code for the item.",
8098          0, 1, productOrService));
8099      children.add(new Property("modifier", "CodeableConcept",
8100          "Item typification or modifiers codes to convey additional context for the product or service.", 0,
8101          java.lang.Integer.MAX_VALUE, modifier));
8102      children.add(new Property("programCode", "CodeableConcept",
8103          "Identifies the program under which this may be recovered.", 0, java.lang.Integer.MAX_VALUE, programCode));
8104      children.add(new Property("quantity", "SimpleQuantity", "The number of repetitions of a service or product.", 0,
8105          1, quantity));
8106      children.add(new Property("unitPrice", "Money",
8107          "If the item is not a group then this is the fee for the product or service, otherwise this is the total of the fees for the details of the group.",
8108          0, 1, unitPrice));
8109      children.add(new Property("factor", "decimal",
8110          "A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.",
8111          0, 1, factor));
8112      children.add(new Property("net", "Money",
8113          "The quantity times the unit price for an additional service or product or charge.", 0, 1, net));
8114      children.add(new Property("udi", "Reference(Device)", "Unique Device Identifiers associated with this line item.",
8115          0, java.lang.Integer.MAX_VALUE, udi));
8116    }
8117
8118    @Override
8119    public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
8120      switch (_hash) {
8121      case 1349547969:
8122        /* sequence */ return new Property("sequence", "positiveInt", "A number to uniquely identify item entries.", 0,
8123            1, sequence);
8124      case 1099842588:
8125        /* revenue */ return new Property("revenue", "CodeableConcept",
8126            "The type of revenue or cost center providing the product and/or service.", 0, 1, revenue);
8127      case 50511102:
8128        /* category */ return new Property("category", "CodeableConcept",
8129            "Code to identify the general type of benefits under which products and services are provided.", 0, 1,
8130            category);
8131      case 1957227299:
8132        /* productOrService */ return new Property("productOrService", "CodeableConcept",
8133            "When the value is a group code then this item collects a set of related claim details, otherwise this contains the product, service, drug or other billing code for the item.",
8134            0, 1, productOrService);
8135      case -615513385:
8136        /* modifier */ return new Property("modifier", "CodeableConcept",
8137            "Item typification or modifiers codes to convey additional context for the product or service.", 0,
8138            java.lang.Integer.MAX_VALUE, modifier);
8139      case 1010065041:
8140        /* programCode */ return new Property("programCode", "CodeableConcept",
8141            "Identifies the program under which this may be recovered.", 0, java.lang.Integer.MAX_VALUE, programCode);
8142      case -1285004149:
8143        /* quantity */ return new Property("quantity", "SimpleQuantity",
8144            "The number of repetitions of a service or product.", 0, 1, quantity);
8145      case -486196699:
8146        /* unitPrice */ return new Property("unitPrice", "Money",
8147            "If the item is not a group then this is the fee for the product or service, otherwise this is the total of the fees for the details of the group.",
8148            0, 1, unitPrice);
8149      case -1282148017:
8150        /* factor */ return new Property("factor", "decimal",
8151            "A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.",
8152            0, 1, factor);
8153      case 108957:
8154        /* net */ return new Property("net", "Money",
8155            "The quantity times the unit price for an additional service or product or charge.", 0, 1, net);
8156      case 115642:
8157        /* udi */ return new Property("udi", "Reference(Device)",
8158            "Unique Device Identifiers associated with this line item.", 0, java.lang.Integer.MAX_VALUE, udi);
8159      default:
8160        return super.getNamedProperty(_hash, _name, _checkValid);
8161      }
8162
8163    }
8164
8165    @Override
8166    public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
8167      switch (hash) {
8168      case 1349547969:
8169        /* sequence */ return this.sequence == null ? new Base[0] : new Base[] { this.sequence }; // PositiveIntType
8170      case 1099842588:
8171        /* revenue */ return this.revenue == null ? new Base[0] : new Base[] { this.revenue }; // CodeableConcept
8172      case 50511102:
8173        /* category */ return this.category == null ? new Base[0] : new Base[] { this.category }; // CodeableConcept
8174      case 1957227299:
8175        /* productOrService */ return this.productOrService == null ? new Base[0]
8176            : new Base[] { this.productOrService }; // CodeableConcept
8177      case -615513385:
8178        /* modifier */ return this.modifier == null ? new Base[0]
8179            : this.modifier.toArray(new Base[this.modifier.size()]); // CodeableConcept
8180      case 1010065041:
8181        /* programCode */ return this.programCode == null ? new Base[0]
8182            : this.programCode.toArray(new Base[this.programCode.size()]); // CodeableConcept
8183      case -1285004149:
8184        /* quantity */ return this.quantity == null ? new Base[0] : new Base[] { this.quantity }; // Quantity
8185      case -486196699:
8186        /* unitPrice */ return this.unitPrice == null ? new Base[0] : new Base[] { this.unitPrice }; // Money
8187      case -1282148017:
8188        /* factor */ return this.factor == null ? new Base[0] : new Base[] { this.factor }; // DecimalType
8189      case 108957:
8190        /* net */ return this.net == null ? new Base[0] : new Base[] { this.net }; // Money
8191      case 115642:
8192        /* udi */ return this.udi == null ? new Base[0] : this.udi.toArray(new Base[this.udi.size()]); // Reference
8193      default:
8194        return super.getProperty(hash, name, checkValid);
8195      }
8196
8197    }
8198
8199    @Override
8200    public Base setProperty(int hash, String name, Base value) throws FHIRException {
8201      switch (hash) {
8202      case 1349547969: // sequence
8203        this.sequence = castToPositiveInt(value); // PositiveIntType
8204        return value;
8205      case 1099842588: // revenue
8206        this.revenue = castToCodeableConcept(value); // CodeableConcept
8207        return value;
8208      case 50511102: // category
8209        this.category = castToCodeableConcept(value); // CodeableConcept
8210        return value;
8211      case 1957227299: // productOrService
8212        this.productOrService = castToCodeableConcept(value); // CodeableConcept
8213        return value;
8214      case -615513385: // modifier
8215        this.getModifier().add(castToCodeableConcept(value)); // CodeableConcept
8216        return value;
8217      case 1010065041: // programCode
8218        this.getProgramCode().add(castToCodeableConcept(value)); // CodeableConcept
8219        return value;
8220      case -1285004149: // quantity
8221        this.quantity = castToQuantity(value); // Quantity
8222        return value;
8223      case -486196699: // unitPrice
8224        this.unitPrice = castToMoney(value); // Money
8225        return value;
8226      case -1282148017: // factor
8227        this.factor = castToDecimal(value); // DecimalType
8228        return value;
8229      case 108957: // net
8230        this.net = castToMoney(value); // Money
8231        return value;
8232      case 115642: // udi
8233        this.getUdi().add(castToReference(value)); // Reference
8234        return value;
8235      default:
8236        return super.setProperty(hash, name, value);
8237      }
8238
8239    }
8240
8241    @Override
8242    public Base setProperty(String name, Base value) throws FHIRException {
8243      if (name.equals("sequence")) {
8244        this.sequence = castToPositiveInt(value); // PositiveIntType
8245      } else if (name.equals("revenue")) {
8246        this.revenue = castToCodeableConcept(value); // CodeableConcept
8247      } else if (name.equals("category")) {
8248        this.category = castToCodeableConcept(value); // CodeableConcept
8249      } else if (name.equals("productOrService")) {
8250        this.productOrService = castToCodeableConcept(value); // CodeableConcept
8251      } else if (name.equals("modifier")) {
8252        this.getModifier().add(castToCodeableConcept(value));
8253      } else if (name.equals("programCode")) {
8254        this.getProgramCode().add(castToCodeableConcept(value));
8255      } else if (name.equals("quantity")) {
8256        this.quantity = castToQuantity(value); // Quantity
8257      } else if (name.equals("unitPrice")) {
8258        this.unitPrice = castToMoney(value); // Money
8259      } else if (name.equals("factor")) {
8260        this.factor = castToDecimal(value); // DecimalType
8261      } else if (name.equals("net")) {
8262        this.net = castToMoney(value); // Money
8263      } else if (name.equals("udi")) {
8264        this.getUdi().add(castToReference(value));
8265      } else
8266        return super.setProperty(name, value);
8267      return value;
8268    }
8269
8270  @Override
8271  public void removeChild(String name, Base value) throws FHIRException {
8272      if (name.equals("sequence")) {
8273        this.sequence = null;
8274      } else if (name.equals("revenue")) {
8275        this.revenue = null;
8276      } else if (name.equals("category")) {
8277        this.category = null;
8278      } else if (name.equals("productOrService")) {
8279        this.productOrService = null;
8280      } else if (name.equals("modifier")) {
8281        this.getModifier().remove(castToCodeableConcept(value));
8282      } else if (name.equals("programCode")) {
8283        this.getProgramCode().remove(castToCodeableConcept(value));
8284      } else if (name.equals("quantity")) {
8285        this.quantity = null;
8286      } else if (name.equals("unitPrice")) {
8287        this.unitPrice = null;
8288      } else if (name.equals("factor")) {
8289        this.factor = null;
8290      } else if (name.equals("net")) {
8291        this.net = null;
8292      } else if (name.equals("udi")) {
8293        this.getUdi().remove(castToReference(value));
8294      } else
8295        super.removeChild(name, value);
8296      
8297    }
8298
8299    @Override
8300    public Base makeProperty(int hash, String name) throws FHIRException {
8301      switch (hash) {
8302      case 1349547969:
8303        return getSequenceElement();
8304      case 1099842588:
8305        return getRevenue();
8306      case 50511102:
8307        return getCategory();
8308      case 1957227299:
8309        return getProductOrService();
8310      case -615513385:
8311        return addModifier();
8312      case 1010065041:
8313        return addProgramCode();
8314      case -1285004149:
8315        return getQuantity();
8316      case -486196699:
8317        return getUnitPrice();
8318      case -1282148017:
8319        return getFactorElement();
8320      case 108957:
8321        return getNet();
8322      case 115642:
8323        return addUdi();
8324      default:
8325        return super.makeProperty(hash, name);
8326      }
8327
8328    }
8329
8330    @Override
8331    public String[] getTypesForProperty(int hash, String name) throws FHIRException {
8332      switch (hash) {
8333      case 1349547969:
8334        /* sequence */ return new String[] { "positiveInt" };
8335      case 1099842588:
8336        /* revenue */ return new String[] { "CodeableConcept" };
8337      case 50511102:
8338        /* category */ return new String[] { "CodeableConcept" };
8339      case 1957227299:
8340        /* productOrService */ return new String[] { "CodeableConcept" };
8341      case -615513385:
8342        /* modifier */ return new String[] { "CodeableConcept" };
8343      case 1010065041:
8344        /* programCode */ return new String[] { "CodeableConcept" };
8345      case -1285004149:
8346        /* quantity */ return new String[] { "SimpleQuantity" };
8347      case -486196699:
8348        /* unitPrice */ return new String[] { "Money" };
8349      case -1282148017:
8350        /* factor */ return new String[] { "decimal" };
8351      case 108957:
8352        /* net */ return new String[] { "Money" };
8353      case 115642:
8354        /* udi */ return new String[] { "Reference" };
8355      default:
8356        return super.getTypesForProperty(hash, name);
8357      }
8358
8359    }
8360
8361    @Override
8362    public Base addChild(String name) throws FHIRException {
8363      if (name.equals("sequence")) {
8364        throw new FHIRException("Cannot call addChild on a singleton property Claim.sequence");
8365      } else if (name.equals("revenue")) {
8366        this.revenue = new CodeableConcept();
8367        return this.revenue;
8368      } else if (name.equals("category")) {
8369        this.category = new CodeableConcept();
8370        return this.category;
8371      } else if (name.equals("productOrService")) {
8372        this.productOrService = new CodeableConcept();
8373        return this.productOrService;
8374      } else if (name.equals("modifier")) {
8375        return addModifier();
8376      } else if (name.equals("programCode")) {
8377        return addProgramCode();
8378      } else if (name.equals("quantity")) {
8379        this.quantity = new Quantity();
8380        return this.quantity;
8381      } else if (name.equals("unitPrice")) {
8382        this.unitPrice = new Money();
8383        return this.unitPrice;
8384      } else if (name.equals("factor")) {
8385        throw new FHIRException("Cannot call addChild on a singleton property Claim.factor");
8386      } else if (name.equals("net")) {
8387        this.net = new Money();
8388        return this.net;
8389      } else if (name.equals("udi")) {
8390        return addUdi();
8391      } else
8392        return super.addChild(name);
8393    }
8394
8395    public SubDetailComponent copy() {
8396      SubDetailComponent dst = new SubDetailComponent();
8397      copyValues(dst);
8398      return dst;
8399    }
8400
8401    public void copyValues(SubDetailComponent dst) {
8402      super.copyValues(dst);
8403      dst.sequence = sequence == null ? null : sequence.copy();
8404      dst.revenue = revenue == null ? null : revenue.copy();
8405      dst.category = category == null ? null : category.copy();
8406      dst.productOrService = productOrService == null ? null : productOrService.copy();
8407      if (modifier != null) {
8408        dst.modifier = new ArrayList<CodeableConcept>();
8409        for (CodeableConcept i : modifier)
8410          dst.modifier.add(i.copy());
8411      }
8412      ;
8413      if (programCode != null) {
8414        dst.programCode = new ArrayList<CodeableConcept>();
8415        for (CodeableConcept i : programCode)
8416          dst.programCode.add(i.copy());
8417      }
8418      ;
8419      dst.quantity = quantity == null ? null : quantity.copy();
8420      dst.unitPrice = unitPrice == null ? null : unitPrice.copy();
8421      dst.factor = factor == null ? null : factor.copy();
8422      dst.net = net == null ? null : net.copy();
8423      if (udi != null) {
8424        dst.udi = new ArrayList<Reference>();
8425        for (Reference i : udi)
8426          dst.udi.add(i.copy());
8427      }
8428      ;
8429    }
8430
8431    @Override
8432    public boolean equalsDeep(Base other_) {
8433      if (!super.equalsDeep(other_))
8434        return false;
8435      if (!(other_ instanceof SubDetailComponent))
8436        return false;
8437      SubDetailComponent o = (SubDetailComponent) other_;
8438      return compareDeep(sequence, o.sequence, true) && compareDeep(revenue, o.revenue, true)
8439          && compareDeep(category, o.category, true) && compareDeep(productOrService, o.productOrService, true)
8440          && compareDeep(modifier, o.modifier, true) && compareDeep(programCode, o.programCode, true)
8441          && compareDeep(quantity, o.quantity, true) && compareDeep(unitPrice, o.unitPrice, true)
8442          && compareDeep(factor, o.factor, true) && compareDeep(net, o.net, true) && compareDeep(udi, o.udi, true);
8443    }
8444
8445    @Override
8446    public boolean equalsShallow(Base other_) {
8447      if (!super.equalsShallow(other_))
8448        return false;
8449      if (!(other_ instanceof SubDetailComponent))
8450        return false;
8451      SubDetailComponent o = (SubDetailComponent) other_;
8452      return compareValues(sequence, o.sequence, true) && compareValues(factor, o.factor, true);
8453    }
8454
8455    public boolean isEmpty() {
8456      return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(sequence, revenue, category, productOrService,
8457          modifier, programCode, quantity, unitPrice, factor, net, udi);
8458    }
8459
8460    public String fhirType() {
8461      return "Claim.item.detail.subDetail";
8462
8463    }
8464
8465  }
8466
8467  /**
8468   * A unique identifier assigned to this claim.
8469   */
8470  @Child(name = "identifier", type = {
8471      Identifier.class }, order = 0, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
8472  @Description(shortDefinition = "Business Identifier for claim", formalDefinition = "A unique identifier assigned to this claim.")
8473  protected List<Identifier> identifier;
8474
8475  /**
8476   * The status of the resource instance.
8477   */
8478  @Child(name = "status", type = { CodeType.class }, order = 1, min = 1, max = 1, modifier = true, summary = true)
8479  @Description(shortDefinition = "active | cancelled | draft | entered-in-error", formalDefinition = "The status of the resource instance.")
8480  @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/fm-status")
8481  protected Enumeration<ClaimStatus> status;
8482
8483  /**
8484   * The category of claim, e.g. oral, pharmacy, vision, institutional,
8485   * professional.
8486   */
8487  @Child(name = "type", type = { CodeableConcept.class }, order = 2, min = 1, max = 1, modifier = false, summary = true)
8488  @Description(shortDefinition = "Category or discipline", formalDefinition = "The category of claim, e.g. oral, pharmacy, vision, institutional, professional.")
8489  @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/claim-type")
8490  protected CodeableConcept type;
8491
8492  /**
8493   * A finer grained suite of claim type codes which may convey additional
8494   * information such as Inpatient vs Outpatient and/or a specialty service.
8495   */
8496  @Child(name = "subType", type = {
8497      CodeableConcept.class }, order = 3, min = 0, max = 1, modifier = false, summary = false)
8498  @Description(shortDefinition = "More granular claim type", formalDefinition = "A finer grained suite of claim type codes which may convey additional information such as Inpatient vs Outpatient and/or a specialty service.")
8499  @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/claim-subtype")
8500  protected CodeableConcept subType;
8501
8502  /**
8503   * A code to indicate whether the nature of the request is: to request
8504   * adjudication of products and services previously rendered; or requesting
8505   * authorization and adjudication for provision in the future; or requesting the
8506   * non-binding adjudication of the listed products and services which could be
8507   * provided in the future.
8508   */
8509  @Child(name = "use", type = { CodeType.class }, order = 4, min = 1, max = 1, modifier = false, summary = true)
8510  @Description(shortDefinition = "claim | preauthorization | predetermination", formalDefinition = "A code to indicate whether the nature of the request is: to request adjudication of products and services previously rendered; or requesting authorization and adjudication for provision in the future; or requesting the non-binding adjudication of the listed products and services which could be provided in the future.")
8511  @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/claim-use")
8512  protected Enumeration<Use> use;
8513
8514  /**
8515   * The party to whom the professional services and/or products have been
8516   * supplied or are being considered and for whom actual or forecast
8517   * reimbursement is sought.
8518   */
8519  @Child(name = "patient", type = { Patient.class }, order = 5, min = 1, max = 1, modifier = false, summary = true)
8520  @Description(shortDefinition = "The recipient of the products and services", formalDefinition = "The party to whom the professional services and/or products have been supplied or are being considered and for whom actual or forecast reimbursement is sought.")
8521  protected Reference patient;
8522
8523  /**
8524   * The actual object that is the target of the reference (The party to whom the
8525   * professional services and/or products have been supplied or are being
8526   * considered and for whom actual or forecast reimbursement is sought.)
8527   */
8528  protected Patient patientTarget;
8529
8530  /**
8531   * The period for which charges are being submitted.
8532   */
8533  @Child(name = "billablePeriod", type = {
8534      Period.class }, order = 6, min = 0, max = 1, modifier = false, summary = true)
8535  @Description(shortDefinition = "Relevant time frame for the claim", formalDefinition = "The period for which charges are being submitted.")
8536  protected Period billablePeriod;
8537
8538  /**
8539   * The date this resource was created.
8540   */
8541  @Child(name = "created", type = { DateTimeType.class }, order = 7, min = 1, max = 1, modifier = false, summary = true)
8542  @Description(shortDefinition = "Resource creation date", formalDefinition = "The date this resource was created.")
8543  protected DateTimeType created;
8544
8545  /**
8546   * Individual who created the claim, predetermination or preauthorization.
8547   */
8548  @Child(name = "enterer", type = { Practitioner.class,
8549      PractitionerRole.class }, order = 8, min = 0, max = 1, modifier = false, summary = false)
8550  @Description(shortDefinition = "Author of the claim", formalDefinition = "Individual who created the claim, predetermination or preauthorization.")
8551  protected Reference enterer;
8552
8553  /**
8554   * The actual object that is the target of the reference (Individual who created
8555   * the claim, predetermination or preauthorization.)
8556   */
8557  protected Resource entererTarget;
8558
8559  /**
8560   * The Insurer who is target of the request.
8561   */
8562  @Child(name = "insurer", type = { Organization.class }, order = 9, min = 0, max = 1, modifier = false, summary = true)
8563  @Description(shortDefinition = "Target", formalDefinition = "The Insurer who is target of the request.")
8564  protected Reference insurer;
8565
8566  /**
8567   * The actual object that is the target of the reference (The Insurer who is
8568   * target of the request.)
8569   */
8570  protected Organization insurerTarget;
8571
8572  /**
8573   * The provider which is responsible for the claim, predetermination or
8574   * preauthorization.
8575   */
8576  @Child(name = "provider", type = { Practitioner.class, PractitionerRole.class,
8577      Organization.class }, order = 10, min = 1, max = 1, modifier = false, summary = true)
8578  @Description(shortDefinition = "Party responsible for the claim", formalDefinition = "The provider which is responsible for the claim, predetermination or preauthorization.")
8579  protected Reference provider;
8580
8581  /**
8582   * The actual object that is the target of the reference (The provider which is
8583   * responsible for the claim, predetermination or preauthorization.)
8584   */
8585  protected Resource providerTarget;
8586
8587  /**
8588   * The provider-required urgency of processing the request. Typical values
8589   * include: stat, routine deferred.
8590   */
8591  @Child(name = "priority", type = {
8592      CodeableConcept.class }, order = 11, min = 1, max = 1, modifier = false, summary = true)
8593  @Description(shortDefinition = "Desired processing ugency", formalDefinition = "The provider-required urgency of processing the request. Typical values include: stat, routine deferred.")
8594  @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/process-priority")
8595  protected CodeableConcept priority;
8596
8597  /**
8598   * A code to indicate whether and for whom funds are to be reserved for future
8599   * claims.
8600   */
8601  @Child(name = "fundsReserve", type = {
8602      CodeableConcept.class }, order = 12, min = 0, max = 1, modifier = false, summary = false)
8603  @Description(shortDefinition = "For whom to reserve funds", formalDefinition = "A code to indicate whether and for whom funds are to be reserved for future claims.")
8604  @ca.uhn.fhir.model.api.annotation.Binding(valueSet = "http://hl7.org/fhir/ValueSet/fundsreserve")
8605  protected CodeableConcept fundsReserve;
8606
8607  /**
8608   * Other claims which are related to this claim such as prior submissions or
8609   * claims for related services or for the same event.
8610   */
8611  @Child(name = "related", type = {}, order = 13, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
8612  @Description(shortDefinition = "Prior or corollary claims", formalDefinition = "Other claims which are related to this claim such as prior submissions or claims for related services or for the same event.")
8613  protected List<RelatedClaimComponent> related;
8614
8615  /**
8616   * Prescription to support the dispensing of pharmacy, device or vision
8617   * products.
8618   */
8619  @Child(name = "prescription", type = { DeviceRequest.class, MedicationRequest.class,
8620      VisionPrescription.class }, order = 14, min = 0, max = 1, modifier = false, summary = false)
8621  @Description(shortDefinition = "Prescription authorizing services and products", formalDefinition = "Prescription to support the dispensing of pharmacy, device or vision products.")
8622  protected Reference prescription;
8623
8624  /**
8625   * The actual object that is the target of the reference (Prescription to
8626   * support the dispensing of pharmacy, device or vision products.)
8627   */
8628  protected Resource prescriptionTarget;
8629
8630  /**
8631   * Original prescription which has been superseded by this prescription to
8632   * support the dispensing of pharmacy services, medications or products.
8633   */
8634  @Child(name = "originalPrescription", type = { DeviceRequest.class, MedicationRequest.class,
8635      VisionPrescription.class }, order = 15, min = 0, max = 1, modifier = false, summary = false)
8636  @Description(shortDefinition = "Original prescription if superseded by fulfiller", formalDefinition = "Original prescription which has been superseded by this prescription to support the dispensing of pharmacy services, medications or products.")
8637  protected Reference originalPrescription;
8638
8639  /**
8640   * The actual object that is the target of the reference (Original prescription
8641   * which has been superseded by this prescription to support the dispensing of
8642   * pharmacy services, medications or products.)
8643   */
8644  protected Resource originalPrescriptionTarget;
8645
8646  /**
8647   * The party to be reimbursed for cost of the products and services according to
8648   * the terms of the policy.
8649   */
8650  @Child(name = "payee", type = {}, order = 16, min = 0, max = 1, modifier = false, summary = false)
8651  @Description(shortDefinition = "Recipient of benefits payable", formalDefinition = "The party to be reimbursed for cost of the products and services according to the terms of the policy.")
8652  protected PayeeComponent payee;
8653
8654  /**
8655   * A reference to a referral resource.
8656   */
8657  @Child(name = "referral", type = {
8658      ServiceRequest.class }, order = 17, min = 0, max = 1, modifier = false, summary = false)
8659  @Description(shortDefinition = "Treatment referral", formalDefinition = "A reference to a referral resource.")
8660  protected Reference referral;
8661
8662  /**
8663   * The actual object that is the target of the reference (A reference to a
8664   * referral resource.)
8665   */
8666  protected ServiceRequest referralTarget;
8667
8668  /**
8669   * Facility where the services were provided.
8670   */
8671  @Child(name = "facility", type = { Location.class }, order = 18, min = 0, max = 1, modifier = false, summary = false)
8672  @Description(shortDefinition = "Servicing facility", formalDefinition = "Facility where the services were provided.")
8673  protected Reference facility;
8674
8675  /**
8676   * The actual object that is the target of the reference (Facility where the
8677   * services were provided.)
8678   */
8679  protected Location facilityTarget;
8680
8681  /**
8682   * The members of the team who provided the products and services.
8683   */
8684  @Child(name = "careTeam", type = {}, order = 19, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
8685  @Description(shortDefinition = "Members of the care team", formalDefinition = "The members of the team who provided the products and services.")
8686  protected List<CareTeamComponent> careTeam;
8687
8688  /**
8689   * Additional information codes regarding exceptions, special considerations,
8690   * the condition, situation, prior or concurrent issues.
8691   */
8692  @Child(name = "supportingInfo", type = {}, order = 20, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
8693  @Description(shortDefinition = "Supporting information", formalDefinition = "Additional information codes regarding exceptions, special considerations, the condition, situation, prior or concurrent issues.")
8694  protected List<SupportingInformationComponent> supportingInfo;
8695
8696  /**
8697   * Information about diagnoses relevant to the claim items.
8698   */
8699  @Child(name = "diagnosis", type = {}, order = 21, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
8700  @Description(shortDefinition = "Pertinent diagnosis information", formalDefinition = "Information about diagnoses relevant to the claim items.")
8701  protected List<DiagnosisComponent> diagnosis;
8702
8703  /**
8704   * Procedures performed on the patient relevant to the billing items with the
8705   * claim.
8706   */
8707  @Child(name = "procedure", type = {}, order = 22, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
8708  @Description(shortDefinition = "Clinical procedures performed", formalDefinition = "Procedures performed on the patient relevant to the billing items with the claim.")
8709  protected List<ProcedureComponent> procedure;
8710
8711  /**
8712   * Financial instruments for reimbursement for the health care products and
8713   * services specified on the claim.
8714   */
8715  @Child(name = "insurance", type = {}, order = 23, min = 1, max = Child.MAX_UNLIMITED, modifier = false, summary = true)
8716  @Description(shortDefinition = "Patient insurance information", formalDefinition = "Financial instruments for reimbursement for the health care products and services specified on the claim.")
8717  protected List<InsuranceComponent> insurance;
8718
8719  /**
8720   * Details of an accident which resulted in injuries which required the products
8721   * and services listed in the claim.
8722   */
8723  @Child(name = "accident", type = {}, order = 24, min = 0, max = 1, modifier = false, summary = false)
8724  @Description(shortDefinition = "Details of the event", formalDefinition = "Details of an accident which resulted in injuries which required the products and services listed in the claim.")
8725  protected AccidentComponent accident;
8726
8727  /**
8728   * A claim line. Either a simple product or service or a 'group' of details
8729   * which can each be a simple items or groups of sub-details.
8730   */
8731  @Child(name = "item", type = {}, order = 25, min = 0, max = Child.MAX_UNLIMITED, modifier = false, summary = false)
8732  @Description(shortDefinition = "Product or service provided", formalDefinition = "A claim line. Either a simple  product or service or a 'group' of details which can each be a simple items or groups of sub-details.")
8733  protected List<ItemComponent> item;
8734
8735  /**
8736   * The total value of the all the items in the claim.
8737   */
8738  @Child(name = "total", type = { Money.class }, order = 26, min = 0, max = 1, modifier = false, summary = false)
8739  @Description(shortDefinition = "Total claim cost", formalDefinition = "The total value of the all the items in the claim.")
8740  protected Money total;
8741
8742  private static final long serialVersionUID = -80376108L;
8743
8744  /**
8745   * Constructor
8746   */
8747  public Claim() {
8748    super();
8749  }
8750
8751  /**
8752   * Constructor
8753   */
8754  public Claim(Enumeration<ClaimStatus> status, CodeableConcept type, Enumeration<Use> use, Reference patient,
8755      DateTimeType created, Reference provider, CodeableConcept priority) {
8756    super();
8757    this.status = status;
8758    this.type = type;
8759    this.use = use;
8760    this.patient = patient;
8761    this.created = created;
8762    this.provider = provider;
8763    this.priority = priority;
8764  }
8765
8766  /**
8767   * @return {@link #identifier} (A unique identifier assigned to this claim.)
8768   */
8769  public List<Identifier> getIdentifier() {
8770    if (this.identifier == null)
8771      this.identifier = new ArrayList<Identifier>();
8772    return this.identifier;
8773  }
8774
8775  /**
8776   * @return Returns a reference to <code>this</code> for easy method chaining
8777   */
8778  public Claim setIdentifier(List<Identifier> theIdentifier) {
8779    this.identifier = theIdentifier;
8780    return this;
8781  }
8782
8783  public boolean hasIdentifier() {
8784    if (this.identifier == null)
8785      return false;
8786    for (Identifier item : this.identifier)
8787      if (!item.isEmpty())
8788        return true;
8789    return false;
8790  }
8791
8792  public Identifier addIdentifier() { // 3
8793    Identifier t = new Identifier();
8794    if (this.identifier == null)
8795      this.identifier = new ArrayList<Identifier>();
8796    this.identifier.add(t);
8797    return t;
8798  }
8799
8800  public Claim addIdentifier(Identifier t) { // 3
8801    if (t == null)
8802      return this;
8803    if (this.identifier == null)
8804      this.identifier = new ArrayList<Identifier>();
8805    this.identifier.add(t);
8806    return this;
8807  }
8808
8809  /**
8810   * @return The first repetition of repeating field {@link #identifier}, creating
8811   *         it if it does not already exist
8812   */
8813  public Identifier getIdentifierFirstRep() {
8814    if (getIdentifier().isEmpty()) {
8815      addIdentifier();
8816    }
8817    return getIdentifier().get(0);
8818  }
8819
8820  /**
8821   * @return {@link #status} (The status of the resource instance.). This is the
8822   *         underlying object with id, value and extensions. The accessor
8823   *         "getStatus" gives direct access to the value
8824   */
8825  public Enumeration<ClaimStatus> getStatusElement() {
8826    if (this.status == null)
8827      if (Configuration.errorOnAutoCreate())
8828        throw new Error("Attempt to auto-create Claim.status");
8829      else if (Configuration.doAutoCreate())
8830        this.status = new Enumeration<ClaimStatus>(new ClaimStatusEnumFactory()); // bb
8831    return this.status;
8832  }
8833
8834  public boolean hasStatusElement() {
8835    return this.status != null && !this.status.isEmpty();
8836  }
8837
8838  public boolean hasStatus() {
8839    return this.status != null && !this.status.isEmpty();
8840  }
8841
8842  /**
8843   * @param value {@link #status} (The status of the resource instance.). This is
8844   *              the underlying object with id, value and extensions. The
8845   *              accessor "getStatus" gives direct access to the value
8846   */
8847  public Claim setStatusElement(Enumeration<ClaimStatus> value) {
8848    this.status = value;
8849    return this;
8850  }
8851
8852  /**
8853   * @return The status of the resource instance.
8854   */
8855  public ClaimStatus getStatus() {
8856    return this.status == null ? null : this.status.getValue();
8857  }
8858
8859  /**
8860   * @param value The status of the resource instance.
8861   */
8862  public Claim setStatus(ClaimStatus value) {
8863    if (this.status == null)
8864      this.status = new Enumeration<ClaimStatus>(new ClaimStatusEnumFactory());
8865    this.status.setValue(value);
8866    return this;
8867  }
8868
8869  /**
8870   * @return {@link #type} (The category of claim, e.g. oral, pharmacy, vision,
8871   *         institutional, professional.)
8872   */
8873  public CodeableConcept getType() {
8874    if (this.type == null)
8875      if (Configuration.errorOnAutoCreate())
8876        throw new Error("Attempt to auto-create Claim.type");
8877      else if (Configuration.doAutoCreate())
8878        this.type = new CodeableConcept(); // cc
8879    return this.type;
8880  }
8881
8882  public boolean hasType() {
8883    return this.type != null && !this.type.isEmpty();
8884  }
8885
8886  /**
8887   * @param value {@link #type} (The category of claim, e.g. oral, pharmacy,
8888   *              vision, institutional, professional.)
8889   */
8890  public Claim setType(CodeableConcept value) {
8891    this.type = value;
8892    return this;
8893  }
8894
8895  /**
8896   * @return {@link #subType} (A finer grained suite of claim type codes which may
8897   *         convey additional information such as Inpatient vs Outpatient and/or
8898   *         a specialty service.)
8899   */
8900  public CodeableConcept getSubType() {
8901    if (this.subType == null)
8902      if (Configuration.errorOnAutoCreate())
8903        throw new Error("Attempt to auto-create Claim.subType");
8904      else if (Configuration.doAutoCreate())
8905        this.subType = new CodeableConcept(); // cc
8906    return this.subType;
8907  }
8908
8909  public boolean hasSubType() {
8910    return this.subType != null && !this.subType.isEmpty();
8911  }
8912
8913  /**
8914   * @param value {@link #subType} (A finer grained suite of claim type codes
8915   *              which may convey additional information such as Inpatient vs
8916   *              Outpatient and/or a specialty service.)
8917   */
8918  public Claim setSubType(CodeableConcept value) {
8919    this.subType = value;
8920    return this;
8921  }
8922
8923  /**
8924   * @return {@link #use} (A code to indicate whether the nature of the request
8925   *         is: to request adjudication of products and services previously
8926   *         rendered; or requesting authorization and adjudication for provision
8927   *         in the future; or requesting the non-binding adjudication of the
8928   *         listed products and services which could be provided in the future.).
8929   *         This is the underlying object with id, value and extensions. The
8930   *         accessor "getUse" gives direct access to the value
8931   */
8932  public Enumeration<Use> getUseElement() {
8933    if (this.use == null)
8934      if (Configuration.errorOnAutoCreate())
8935        throw new Error("Attempt to auto-create Claim.use");
8936      else if (Configuration.doAutoCreate())
8937        this.use = new Enumeration<Use>(new UseEnumFactory()); // bb
8938    return this.use;
8939  }
8940
8941  public boolean hasUseElement() {
8942    return this.use != null && !this.use.isEmpty();
8943  }
8944
8945  public boolean hasUse() {
8946    return this.use != null && !this.use.isEmpty();
8947  }
8948
8949  /**
8950   * @param value {@link #use} (A code to indicate whether the nature of the
8951   *              request is: to request adjudication of products and services
8952   *              previously rendered; or requesting authorization and
8953   *              adjudication for provision in the future; or requesting the
8954   *              non-binding adjudication of the listed products and services
8955   *              which could be provided in the future.). This is the underlying
8956   *              object with id, value and extensions. The accessor "getUse"
8957   *              gives direct access to the value
8958   */
8959  public Claim setUseElement(Enumeration<Use> value) {
8960    this.use = value;
8961    return this;
8962  }
8963
8964  /**
8965   * @return A code to indicate whether the nature of the request is: to request
8966   *         adjudication of products and services previously rendered; or
8967   *         requesting authorization and adjudication for provision in the
8968   *         future; or requesting the non-binding adjudication of the listed
8969   *         products and services which could be provided in the future.
8970   */
8971  public Use getUse() {
8972    return this.use == null ? null : this.use.getValue();
8973  }
8974
8975  /**
8976   * @param value A code to indicate whether the nature of the request is: to
8977   *              request adjudication of products and services previously
8978   *              rendered; or requesting authorization and adjudication for
8979   *              provision in the future; or requesting the non-binding
8980   *              adjudication of the listed products and services which could be
8981   *              provided in the future.
8982   */
8983  public Claim setUse(Use value) {
8984    if (this.use == null)
8985      this.use = new Enumeration<Use>(new UseEnumFactory());
8986    this.use.setValue(value);
8987    return this;
8988  }
8989
8990  /**
8991   * @return {@link #patient} (The party to whom the professional services and/or
8992   *         products have been supplied or are being considered and for whom
8993   *         actual or forecast reimbursement is sought.)
8994   */
8995  public Reference getPatient() {
8996    if (this.patient == null)
8997      if (Configuration.errorOnAutoCreate())
8998        throw new Error("Attempt to auto-create Claim.patient");
8999      else if (Configuration.doAutoCreate())
9000        this.patient = new Reference(); // cc
9001    return this.patient;
9002  }
9003
9004  public boolean hasPatient() {
9005    return this.patient != null && !this.patient.isEmpty();
9006  }
9007
9008  /**
9009   * @param value {@link #patient} (The party to whom the professional services
9010   *              and/or products have been supplied or are being considered and
9011   *              for whom actual or forecast reimbursement is sought.)
9012   */
9013  public Claim setPatient(Reference value) {
9014    this.patient = value;
9015    return this;
9016  }
9017
9018  /**
9019   * @return {@link #patient} The actual object that is the target of the
9020   *         reference. The reference library doesn't populate this, but you can
9021   *         use it to hold the resource if you resolve it. (The party to whom the
9022   *         professional services and/or products have been supplied or are being
9023   *         considered and for whom actual or forecast reimbursement is sought.)
9024   */
9025  public Patient getPatientTarget() {
9026    if (this.patientTarget == null)
9027      if (Configuration.errorOnAutoCreate())
9028        throw new Error("Attempt to auto-create Claim.patient");
9029      else if (Configuration.doAutoCreate())
9030        this.patientTarget = new Patient(); // aa
9031    return this.patientTarget;
9032  }
9033
9034  /**
9035   * @param value {@link #patient} The actual object that is the target of the
9036   *              reference. The reference library doesn't use these, but you can
9037   *              use it to hold the resource if you resolve it. (The party to
9038   *              whom the professional services and/or products have been
9039   *              supplied or are being considered and for whom actual or forecast
9040   *              reimbursement is sought.)
9041   */
9042  public Claim setPatientTarget(Patient value) {
9043    this.patientTarget = value;
9044    return this;
9045  }
9046
9047  /**
9048   * @return {@link #billablePeriod} (The period for which charges are being
9049   *         submitted.)
9050   */
9051  public Period getBillablePeriod() {
9052    if (this.billablePeriod == null)
9053      if (Configuration.errorOnAutoCreate())
9054        throw new Error("Attempt to auto-create Claim.billablePeriod");
9055      else if (Configuration.doAutoCreate())
9056        this.billablePeriod = new Period(); // cc
9057    return this.billablePeriod;
9058  }
9059
9060  public boolean hasBillablePeriod() {
9061    return this.billablePeriod != null && !this.billablePeriod.isEmpty();
9062  }
9063
9064  /**
9065   * @param value {@link #billablePeriod} (The period for which charges are being
9066   *              submitted.)
9067   */
9068  public Claim setBillablePeriod(Period value) {
9069    this.billablePeriod = value;
9070    return this;
9071  }
9072
9073  /**
9074   * @return {@link #created} (The date this resource was created.). This is the
9075   *         underlying object with id, value and extensions. The accessor
9076   *         "getCreated" gives direct access to the value
9077   */
9078  public DateTimeType getCreatedElement() {
9079    if (this.created == null)
9080      if (Configuration.errorOnAutoCreate())
9081        throw new Error("Attempt to auto-create Claim.created");
9082      else if (Configuration.doAutoCreate())
9083        this.created = new DateTimeType(); // bb
9084    return this.created;
9085  }
9086
9087  public boolean hasCreatedElement() {
9088    return this.created != null && !this.created.isEmpty();
9089  }
9090
9091  public boolean hasCreated() {
9092    return this.created != null && !this.created.isEmpty();
9093  }
9094
9095  /**
9096   * @param value {@link #created} (The date this resource was created.). This is
9097   *              the underlying object with id, value and extensions. The
9098   *              accessor "getCreated" gives direct access to the value
9099   */
9100  public Claim setCreatedElement(DateTimeType value) {
9101    this.created = value;
9102    return this;
9103  }
9104
9105  /**
9106   * @return The date this resource was created.
9107   */
9108  public Date getCreated() {
9109    return this.created == null ? null : this.created.getValue();
9110  }
9111
9112  /**
9113   * @param value The date this resource was created.
9114   */
9115  public Claim setCreated(Date value) {
9116    if (this.created == null)
9117      this.created = new DateTimeType();
9118    this.created.setValue(value);
9119    return this;
9120  }
9121
9122  /**
9123   * @return {@link #enterer} (Individual who created the claim, predetermination
9124   *         or preauthorization.)
9125   */
9126  public Reference getEnterer() {
9127    if (this.enterer == null)
9128      if (Configuration.errorOnAutoCreate())
9129        throw new Error("Attempt to auto-create Claim.enterer");
9130      else if (Configuration.doAutoCreate())
9131        this.enterer = new Reference(); // cc
9132    return this.enterer;
9133  }
9134
9135  public boolean hasEnterer() {
9136    return this.enterer != null && !this.enterer.isEmpty();
9137  }
9138
9139  /**
9140   * @param value {@link #enterer} (Individual who created the claim,
9141   *              predetermination or preauthorization.)
9142   */
9143  public Claim setEnterer(Reference value) {
9144    this.enterer = value;
9145    return this;
9146  }
9147
9148  /**
9149   * @return {@link #enterer} The actual object that is the target of the
9150   *         reference. The reference library doesn't populate this, but you can
9151   *         use it to hold the resource if you resolve it. (Individual who
9152   *         created the claim, predetermination or preauthorization.)
9153   */
9154  public Resource getEntererTarget() {
9155    return this.entererTarget;
9156  }
9157
9158  /**
9159   * @param value {@link #enterer} The actual object that is the target of the
9160   *              reference. The reference library doesn't use these, but you can
9161   *              use it to hold the resource if you resolve it. (Individual who
9162   *              created the claim, predetermination or preauthorization.)
9163   */
9164  public Claim setEntererTarget(Resource value) {
9165    this.entererTarget = value;
9166    return this;
9167  }
9168
9169  /**
9170   * @return {@link #insurer} (The Insurer who is target of the request.)
9171   */
9172  public Reference getInsurer() {
9173    if (this.insurer == null)
9174      if (Configuration.errorOnAutoCreate())
9175        throw new Error("Attempt to auto-create Claim.insurer");
9176      else if (Configuration.doAutoCreate())
9177        this.insurer = new Reference(); // cc
9178    return this.insurer;
9179  }
9180
9181  public boolean hasInsurer() {
9182    return this.insurer != null && !this.insurer.isEmpty();
9183  }
9184
9185  /**
9186   * @param value {@link #insurer} (The Insurer who is target of the request.)
9187   */
9188  public Claim setInsurer(Reference value) {
9189    this.insurer = value;
9190    return this;
9191  }
9192
9193  /**
9194   * @return {@link #insurer} The actual object that is the target of the
9195   *         reference. The reference library doesn't populate this, but you can
9196   *         use it to hold the resource if you resolve it. (The Insurer who is
9197   *         target of the request.)
9198   */
9199  public Organization getInsurerTarget() {
9200    if (this.insurerTarget == null)
9201      if (Configuration.errorOnAutoCreate())
9202        throw new Error("Attempt to auto-create Claim.insurer");
9203      else if (Configuration.doAutoCreate())
9204        this.insurerTarget = new Organization(); // aa
9205    return this.insurerTarget;
9206  }
9207
9208  /**
9209   * @param value {@link #insurer} The actual object that is the target of the
9210   *              reference. The reference library doesn't use these, but you can
9211   *              use it to hold the resource if you resolve it. (The Insurer who
9212   *              is target of the request.)
9213   */
9214  public Claim setInsurerTarget(Organization value) {
9215    this.insurerTarget = value;
9216    return this;
9217  }
9218
9219  /**
9220   * @return {@link #provider} (The provider which is responsible for the claim,
9221   *         predetermination or preauthorization.)
9222   */
9223  public Reference getProvider() {
9224    if (this.provider == null)
9225      if (Configuration.errorOnAutoCreate())
9226        throw new Error("Attempt to auto-create Claim.provider");
9227      else if (Configuration.doAutoCreate())
9228        this.provider = new Reference(); // cc
9229    return this.provider;
9230  }
9231
9232  public boolean hasProvider() {
9233    return this.provider != null && !this.provider.isEmpty();
9234  }
9235
9236  /**
9237   * @param value {@link #provider} (The provider which is responsible for the
9238   *              claim, predetermination or preauthorization.)
9239   */
9240  public Claim setProvider(Reference value) {
9241    this.provider = value;
9242    return this;
9243  }
9244
9245  /**
9246   * @return {@link #provider} The actual object that is the target of the
9247   *         reference. The reference library doesn't populate this, but you can
9248   *         use it to hold the resource if you resolve it. (The provider which is
9249   *         responsible for the claim, predetermination or preauthorization.)
9250   */
9251  public Resource getProviderTarget() {
9252    return this.providerTarget;
9253  }
9254
9255  /**
9256   * @param value {@link #provider} The actual object that is the target of the
9257   *              reference. The reference library doesn't use these, but you can
9258   *              use it to hold the resource if you resolve it. (The provider
9259   *              which is responsible for the claim, predetermination or
9260   *              preauthorization.)
9261   */
9262  public Claim setProviderTarget(Resource value) {
9263    this.providerTarget = value;
9264    return this;
9265  }
9266
9267  /**
9268   * @return {@link #priority} (The provider-required urgency of processing the
9269   *         request. Typical values include: stat, routine deferred.)
9270   */
9271  public CodeableConcept getPriority() {
9272    if (this.priority == null)
9273      if (Configuration.errorOnAutoCreate())
9274        throw new Error("Attempt to auto-create Claim.priority");
9275      else if (Configuration.doAutoCreate())
9276        this.priority = new CodeableConcept(); // cc
9277    return this.priority;
9278  }
9279
9280  public boolean hasPriority() {
9281    return this.priority != null && !this.priority.isEmpty();
9282  }
9283
9284  /**
9285   * @param value {@link #priority} (The provider-required urgency of processing
9286   *              the request. Typical values include: stat, routine deferred.)
9287   */
9288  public Claim setPriority(CodeableConcept value) {
9289    this.priority = value;
9290    return this;
9291  }
9292
9293  /**
9294   * @return {@link #fundsReserve} (A code to indicate whether and for whom funds
9295   *         are to be reserved for future claims.)
9296   */
9297  public CodeableConcept getFundsReserve() {
9298    if (this.fundsReserve == null)
9299      if (Configuration.errorOnAutoCreate())
9300        throw new Error("Attempt to auto-create Claim.fundsReserve");
9301      else if (Configuration.doAutoCreate())
9302        this.fundsReserve = new CodeableConcept(); // cc
9303    return this.fundsReserve;
9304  }
9305
9306  public boolean hasFundsReserve() {
9307    return this.fundsReserve != null && !this.fundsReserve.isEmpty();
9308  }
9309
9310  /**
9311   * @param value {@link #fundsReserve} (A code to indicate whether and for whom
9312   *              funds are to be reserved for future claims.)
9313   */
9314  public Claim setFundsReserve(CodeableConcept value) {
9315    this.fundsReserve = value;
9316    return this;
9317  }
9318
9319  /**
9320   * @return {@link #related} (Other claims which are related to this claim such
9321   *         as prior submissions or claims for related services or for the same
9322   *         event.)
9323   */
9324  public List<RelatedClaimComponent> getRelated() {
9325    if (this.related == null)
9326      this.related = new ArrayList<RelatedClaimComponent>();
9327    return this.related;
9328  }
9329
9330  /**
9331   * @return Returns a reference to <code>this</code> for easy method chaining
9332   */
9333  public Claim setRelated(List<RelatedClaimComponent> theRelated) {
9334    this.related = theRelated;
9335    return this;
9336  }
9337
9338  public boolean hasRelated() {
9339    if (this.related == null)
9340      return false;
9341    for (RelatedClaimComponent item : this.related)
9342      if (!item.isEmpty())
9343        return true;
9344    return false;
9345  }
9346
9347  public RelatedClaimComponent addRelated() { // 3
9348    RelatedClaimComponent t = new RelatedClaimComponent();
9349    if (this.related == null)
9350      this.related = new ArrayList<RelatedClaimComponent>();
9351    this.related.add(t);
9352    return t;
9353  }
9354
9355  public Claim addRelated(RelatedClaimComponent t) { // 3
9356    if (t == null)
9357      return this;
9358    if (this.related == null)
9359      this.related = new ArrayList<RelatedClaimComponent>();
9360    this.related.add(t);
9361    return this;
9362  }
9363
9364  /**
9365   * @return The first repetition of repeating field {@link #related}, creating it
9366   *         if it does not already exist
9367   */
9368  public RelatedClaimComponent getRelatedFirstRep() {
9369    if (getRelated().isEmpty()) {
9370      addRelated();
9371    }
9372    return getRelated().get(0);
9373  }
9374
9375  /**
9376   * @return {@link #prescription} (Prescription to support the dispensing of
9377   *         pharmacy, device or vision products.)
9378   */
9379  public Reference getPrescription() {
9380    if (this.prescription == null)
9381      if (Configuration.errorOnAutoCreate())
9382        throw new Error("Attempt to auto-create Claim.prescription");
9383      else if (Configuration.doAutoCreate())
9384        this.prescription = new Reference(); // cc
9385    return this.prescription;
9386  }
9387
9388  public boolean hasPrescription() {
9389    return this.prescription != null && !this.prescription.isEmpty();
9390  }
9391
9392  /**
9393   * @param value {@link #prescription} (Prescription to support the dispensing of
9394   *              pharmacy, device or vision products.)
9395   */
9396  public Claim setPrescription(Reference value) {
9397    this.prescription = value;
9398    return this;
9399  }
9400
9401  /**
9402   * @return {@link #prescription} The actual object that is the target of the
9403   *         reference. The reference library doesn't populate this, but you can
9404   *         use it to hold the resource if you resolve it. (Prescription to
9405   *         support the dispensing of pharmacy, device or vision products.)
9406   */
9407  public Resource getPrescriptionTarget() {
9408    return this.prescriptionTarget;
9409  }
9410
9411  /**
9412   * @param value {@link #prescription} The actual object that is the target of
9413   *              the reference. The reference library doesn't use these, but you
9414   *              can use it to hold the resource if you resolve it. (Prescription
9415   *              to support the dispensing of pharmacy, device or vision
9416   *              products.)
9417   */
9418  public Claim setPrescriptionTarget(Resource value) {
9419    this.prescriptionTarget = value;
9420    return this;
9421  }
9422
9423  /**
9424   * @return {@link #originalPrescription} (Original prescription which has been
9425   *         superseded by this prescription to support the dispensing of pharmacy
9426   *         services, medications or products.)
9427   */
9428  public Reference getOriginalPrescription() {
9429    if (this.originalPrescription == null)
9430      if (Configuration.errorOnAutoCreate())
9431        throw new Error("Attempt to auto-create Claim.originalPrescription");
9432      else if (Configuration.doAutoCreate())
9433        this.originalPrescription = new Reference(); // cc
9434    return this.originalPrescription;
9435  }
9436
9437  public boolean hasOriginalPrescription() {
9438    return this.originalPrescription != null && !this.originalPrescription.isEmpty();
9439  }
9440
9441  /**
9442   * @param value {@link #originalPrescription} (Original prescription which has
9443   *              been superseded by this prescription to support the dispensing
9444   *              of pharmacy services, medications or products.)
9445   */
9446  public Claim setOriginalPrescription(Reference value) {
9447    this.originalPrescription = value;
9448    return this;
9449  }
9450
9451  /**
9452   * @return {@link #originalPrescription} The actual object that is the target of
9453   *         the reference. The reference library doesn't populate this, but you
9454   *         can use it to hold the resource if you resolve it. (Original
9455   *         prescription which has been superseded by this prescription to
9456   *         support the dispensing of pharmacy services, medications or
9457   *         products.)
9458   */
9459  public Resource getOriginalPrescriptionTarget() {
9460    return this.originalPrescriptionTarget;
9461  }
9462
9463  /**
9464   * @param value {@link #originalPrescription} The actual object that is the
9465   *              target of the reference. The reference library doesn't use
9466   *              these, but you can use it to hold the resource if you resolve
9467   *              it. (Original prescription which has been superseded by this
9468   *              prescription to support the dispensing of pharmacy services,
9469   *              medications or products.)
9470   */
9471  public Claim setOriginalPrescriptionTarget(Resource value) {
9472    this.originalPrescriptionTarget = value;
9473    return this;
9474  }
9475
9476  /**
9477   * @return {@link #payee} (The party to be reimbursed for cost of the products
9478   *         and services according to the terms of the policy.)
9479   */
9480  public PayeeComponent getPayee() {
9481    if (this.payee == null)
9482      if (Configuration.errorOnAutoCreate())
9483        throw new Error("Attempt to auto-create Claim.payee");
9484      else if (Configuration.doAutoCreate())
9485        this.payee = new PayeeComponent(); // cc
9486    return this.payee;
9487  }
9488
9489  public boolean hasPayee() {
9490    return this.payee != null && !this.payee.isEmpty();
9491  }
9492
9493  /**
9494   * @param value {@link #payee} (The party to be reimbursed for cost of the
9495   *              products and services according to the terms of the policy.)
9496   */
9497  public Claim setPayee(PayeeComponent value) {
9498    this.payee = value;
9499    return this;
9500  }
9501
9502  /**
9503   * @return {@link #referral} (A reference to a referral resource.)
9504   */
9505  public Reference getReferral() {
9506    if (this.referral == null)
9507      if (Configuration.errorOnAutoCreate())
9508        throw new Error("Attempt to auto-create Claim.referral");
9509      else if (Configuration.doAutoCreate())
9510        this.referral = new Reference(); // cc
9511    return this.referral;
9512  }
9513
9514  public boolean hasReferral() {
9515    return this.referral != null && !this.referral.isEmpty();
9516  }
9517
9518  /**
9519   * @param value {@link #referral} (A reference to a referral resource.)
9520   */
9521  public Claim setReferral(Reference value) {
9522    this.referral = value;
9523    return this;
9524  }
9525
9526  /**
9527   * @return {@link #referral} The actual object that is the target of the
9528   *         reference. The reference library doesn't populate this, but you can
9529   *         use it to hold the resource if you resolve it. (A reference to a
9530   *         referral resource.)
9531   */
9532  public ServiceRequest getReferralTarget() {
9533    if (this.referralTarget == null)
9534      if (Configuration.errorOnAutoCreate())
9535        throw new Error("Attempt to auto-create Claim.referral");
9536      else if (Configuration.doAutoCreate())
9537        this.referralTarget = new ServiceRequest(); // aa
9538    return this.referralTarget;
9539  }
9540
9541  /**
9542   * @param value {@link #referral} The actual object that is the target of the
9543   *              reference. The reference library doesn't use these, but you can
9544   *              use it to hold the resource if you resolve it. (A reference to a
9545   *              referral resource.)
9546   */
9547  public Claim setReferralTarget(ServiceRequest value) {
9548    this.referralTarget = value;
9549    return this;
9550  }
9551
9552  /**
9553   * @return {@link #facility} (Facility where the services were provided.)
9554   */
9555  public Reference getFacility() {
9556    if (this.facility == null)
9557      if (Configuration.errorOnAutoCreate())
9558        throw new Error("Attempt to auto-create Claim.facility");
9559      else if (Configuration.doAutoCreate())
9560        this.facility = new Reference(); // cc
9561    return this.facility;
9562  }
9563
9564  public boolean hasFacility() {
9565    return this.facility != null && !this.facility.isEmpty();
9566  }
9567
9568  /**
9569   * @param value {@link #facility} (Facility where the services were provided.)
9570   */
9571  public Claim setFacility(Reference value) {
9572    this.facility = value;
9573    return this;
9574  }
9575
9576  /**
9577   * @return {@link #facility} The actual object that is the target of the
9578   *         reference. The reference library doesn't populate this, but you can
9579   *         use it to hold the resource if you resolve it. (Facility where the
9580   *         services were provided.)
9581   */
9582  public Location getFacilityTarget() {
9583    if (this.facilityTarget == null)
9584      if (Configuration.errorOnAutoCreate())
9585        throw new Error("Attempt to auto-create Claim.facility");
9586      else if (Configuration.doAutoCreate())
9587        this.facilityTarget = new Location(); // aa
9588    return this.facilityTarget;
9589  }
9590
9591  /**
9592   * @param value {@link #facility} The actual object that is the target of the
9593   *              reference. The reference library doesn't use these, but you can
9594   *              use it to hold the resource if you resolve it. (Facility where
9595   *              the services were provided.)
9596   */
9597  public Claim setFacilityTarget(Location value) {
9598    this.facilityTarget = value;
9599    return this;
9600  }
9601
9602  /**
9603   * @return {@link #careTeam} (The members of the team who provided the products
9604   *         and services.)
9605   */
9606  public List<CareTeamComponent> getCareTeam() {
9607    if (this.careTeam == null)
9608      this.careTeam = new ArrayList<CareTeamComponent>();
9609    return this.careTeam;
9610  }
9611
9612  /**
9613   * @return Returns a reference to <code>this</code> for easy method chaining
9614   */
9615  public Claim setCareTeam(List<CareTeamComponent> theCareTeam) {
9616    this.careTeam = theCareTeam;
9617    return this;
9618  }
9619
9620  public boolean hasCareTeam() {
9621    if (this.careTeam == null)
9622      return false;
9623    for (CareTeamComponent item : this.careTeam)
9624      if (!item.isEmpty())
9625        return true;
9626    return false;
9627  }
9628
9629  public CareTeamComponent addCareTeam() { // 3
9630    CareTeamComponent t = new CareTeamComponent();
9631    if (this.careTeam == null)
9632      this.careTeam = new ArrayList<CareTeamComponent>();
9633    this.careTeam.add(t);
9634    return t;
9635  }
9636
9637  public Claim addCareTeam(CareTeamComponent t) { // 3
9638    if (t == null)
9639      return this;
9640    if (this.careTeam == null)
9641      this.careTeam = new ArrayList<CareTeamComponent>();
9642    this.careTeam.add(t);
9643    return this;
9644  }
9645
9646  /**
9647   * @return The first repetition of repeating field {@link #careTeam}, creating
9648   *         it if it does not already exist
9649   */
9650  public CareTeamComponent getCareTeamFirstRep() {
9651    if (getCareTeam().isEmpty()) {
9652      addCareTeam();
9653    }
9654    return getCareTeam().get(0);
9655  }
9656
9657  /**
9658   * @return {@link #supportingInfo} (Additional information codes regarding
9659   *         exceptions, special considerations, the condition, situation, prior
9660   *         or concurrent issues.)
9661   */
9662  public List<SupportingInformationComponent> getSupportingInfo() {
9663    if (this.supportingInfo == null)
9664      this.supportingInfo = new ArrayList<SupportingInformationComponent>();
9665    return this.supportingInfo;
9666  }
9667
9668  /**
9669   * @return Returns a reference to <code>this</code> for easy method chaining
9670   */
9671  public Claim setSupportingInfo(List<SupportingInformationComponent> theSupportingInfo) {
9672    this.supportingInfo = theSupportingInfo;
9673    return this;
9674  }
9675
9676  public boolean hasSupportingInfo() {
9677    if (this.supportingInfo == null)
9678      return false;
9679    for (SupportingInformationComponent item : this.supportingInfo)
9680      if (!item.isEmpty())
9681        return true;
9682    return false;
9683  }
9684
9685  public SupportingInformationComponent addSupportingInfo() { // 3
9686    SupportingInformationComponent t = new SupportingInformationComponent();
9687    if (this.supportingInfo == null)
9688      this.supportingInfo = new ArrayList<SupportingInformationComponent>();
9689    this.supportingInfo.add(t);
9690    return t;
9691  }
9692
9693  public Claim addSupportingInfo(SupportingInformationComponent t) { // 3
9694    if (t == null)
9695      return this;
9696    if (this.supportingInfo == null)
9697      this.supportingInfo = new ArrayList<SupportingInformationComponent>();
9698    this.supportingInfo.add(t);
9699    return this;
9700  }
9701
9702  /**
9703   * @return The first repetition of repeating field {@link #supportingInfo},
9704   *         creating it if it does not already exist
9705   */
9706  public SupportingInformationComponent getSupportingInfoFirstRep() {
9707    if (getSupportingInfo().isEmpty()) {
9708      addSupportingInfo();
9709    }
9710    return getSupportingInfo().get(0);
9711  }
9712
9713  /**
9714   * @return {@link #diagnosis} (Information about diagnoses relevant to the claim
9715   *         items.)
9716   */
9717  public List<DiagnosisComponent> getDiagnosis() {
9718    if (this.diagnosis == null)
9719      this.diagnosis = new ArrayList<DiagnosisComponent>();
9720    return this.diagnosis;
9721  }
9722
9723  /**
9724   * @return Returns a reference to <code>this</code> for easy method chaining
9725   */
9726  public Claim setDiagnosis(List<DiagnosisComponent> theDiagnosis) {
9727    this.diagnosis = theDiagnosis;
9728    return this;
9729  }
9730
9731  public boolean hasDiagnosis() {
9732    if (this.diagnosis == null)
9733      return false;
9734    for (DiagnosisComponent item : this.diagnosis)
9735      if (!item.isEmpty())
9736        return true;
9737    return false;
9738  }
9739
9740  public DiagnosisComponent addDiagnosis() { // 3
9741    DiagnosisComponent t = new DiagnosisComponent();
9742    if (this.diagnosis == null)
9743      this.diagnosis = new ArrayList<DiagnosisComponent>();
9744    this.diagnosis.add(t);
9745    return t;
9746  }
9747
9748  public Claim addDiagnosis(DiagnosisComponent t) { // 3
9749    if (t == null)
9750      return this;
9751    if (this.diagnosis == null)
9752      this.diagnosis = new ArrayList<DiagnosisComponent>();
9753    this.diagnosis.add(t);
9754    return this;
9755  }
9756
9757  /**
9758   * @return The first repetition of repeating field {@link #diagnosis}, creating
9759   *         it if it does not already exist
9760   */
9761  public DiagnosisComponent getDiagnosisFirstRep() {
9762    if (getDiagnosis().isEmpty()) {
9763      addDiagnosis();
9764    }
9765    return getDiagnosis().get(0);
9766  }
9767
9768  /**
9769   * @return {@link #procedure} (Procedures performed on the patient relevant to
9770   *         the billing items with the claim.)
9771   */
9772  public List<ProcedureComponent> getProcedure() {
9773    if (this.procedure == null)
9774      this.procedure = new ArrayList<ProcedureComponent>();
9775    return this.procedure;
9776  }
9777
9778  /**
9779   * @return Returns a reference to <code>this</code> for easy method chaining
9780   */
9781  public Claim setProcedure(List<ProcedureComponent> theProcedure) {
9782    this.procedure = theProcedure;
9783    return this;
9784  }
9785
9786  public boolean hasProcedure() {
9787    if (this.procedure == null)
9788      return false;
9789    for (ProcedureComponent item : this.procedure)
9790      if (!item.isEmpty())
9791        return true;