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