001package org.hl7.fhir.r5.model;
002
003
004/*
005  Copyright (c) 2011+, HL7, Inc.
006  All rights reserved.
007  
008  Redistribution and use in source and binary forms, with or without modification, \
009  are permitted provided that the following conditions are met:
010  
011   * Redistributions of source code must retain the above copyright notice, this \
012     list of conditions and the following disclaimer.
013   * Redistributions in binary form must reproduce the above copyright notice, \
014     this list of conditions and the following disclaimer in the documentation \
015     and/or other materials provided with the distribution.
016   * Neither the name of HL7 nor the names of its contributors may be used to 
017     endorse or promote products derived from this software without specific 
018     prior written permission.
019  
020  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \
021  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \
022  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \
023  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \
024  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT \
025  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR \
026  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, \
027  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) \
028  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE \
029  POSSIBILITY OF SUCH DAMAGE.
030  */
031
032// Generated on Thu, Mar 23, 2023 19:59+1100 for FHIR v5.0.0
033
034import java.util.ArrayList;
035import java.util.Date;
036import java.util.List;
037import org.hl7.fhir.r5.model.Enumerations.*;
038import org.hl7.fhir.instance.model.api.IBaseDatatypeElement;
039import org.hl7.fhir.exceptions.FHIRException;
040import org.hl7.fhir.instance.model.api.ICompositeType;
041import ca.uhn.fhir.model.api.annotation.Child;
042import ca.uhn.fhir.model.api.annotation.ChildOrder;
043import ca.uhn.fhir.model.api.annotation.DatatypeDef;
044import ca.uhn.fhir.model.api.annotation.Description;
045import ca.uhn.fhir.model.api.annotation.Block;
046
047/**
048 * ExtendedContactDetail Type: Specifies contact information for a specific purpose over a period of time, might be handled/monitored by a specific named person or organization.
049 */
050@DatatypeDef(name="ExtendedContactDetail")
051public class ExtendedContactDetail extends DataType implements ICompositeType {
052
053    /**
054     * The purpose/type of contact.
055     */
056    @Child(name = "purpose", type = {CodeableConcept.class}, order=0, min=0, max=1, modifier=false, summary=true)
057    @Description(shortDefinition="The type of contact", formalDefinition="The purpose/type of contact." )
058    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://terminology.hl7.org/ValueSet/contactentity-type")
059    protected CodeableConcept purpose;
060
061    /**
062     * The name of an individual to contact, some types of contact detail are usually blank.
063     */
064    @Child(name = "name", type = {HumanName.class}, order=1, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
065    @Description(shortDefinition="Name of an individual to contact", formalDefinition="The name of an individual to contact, some types of contact detail are usually blank." )
066    protected List<HumanName> name;
067
068    /**
069     * The contact details application for the purpose defined.
070     */
071    @Child(name = "telecom", type = {ContactPoint.class}, order=2, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
072    @Description(shortDefinition="Contact details (e.g.phone/fax/url)", formalDefinition="The contact details application for the purpose defined." )
073    protected List<ContactPoint> telecom;
074
075    /**
076     * Address for the contact.
077     */
078    @Child(name = "address", type = {Address.class}, order=3, min=0, max=1, modifier=false, summary=true)
079    @Description(shortDefinition="Address for the contact", formalDefinition="Address for the contact." )
080    protected Address address;
081
082    /**
083     * This contact detail is handled/monitored by a specific organization. If the name is provided in the contact, then it is referring to the named individual within this organization.
084     */
085    @Child(name = "organization", type = {Organization.class}, order=4, min=0, max=1, modifier=false, summary=true)
086    @Description(shortDefinition="This contact detail is handled/monitored by a specific organization", formalDefinition="This contact detail is handled/monitored by a specific organization. If the name is provided in the contact, then it is referring to the named individual within this organization." )
087    protected Reference organization;
088
089    /**
090     * Period that this contact was valid for usage.
091     */
092    @Child(name = "period", type = {Period.class}, order=5, min=0, max=1, modifier=false, summary=true)
093    @Description(shortDefinition="Period that this contact was valid for usage", formalDefinition="Period that this contact was valid for usage." )
094    protected Period period;
095
096    private static final long serialVersionUID = 154672475L;
097
098  /**
099   * Constructor
100   */
101    public ExtendedContactDetail() {
102      super();
103    }
104
105    /**
106     * @return {@link #purpose} (The purpose/type of contact.)
107     */
108    public CodeableConcept getPurpose() { 
109      if (this.purpose == null)
110        if (Configuration.errorOnAutoCreate())
111          throw new Error("Attempt to auto-create ExtendedContactDetail.purpose");
112        else if (Configuration.doAutoCreate())
113          this.purpose = new CodeableConcept(); // cc
114      return this.purpose;
115    }
116
117    public boolean hasPurpose() { 
118      return this.purpose != null && !this.purpose.isEmpty();
119    }
120
121    /**
122     * @param value {@link #purpose} (The purpose/type of contact.)
123     */
124    public ExtendedContactDetail setPurpose(CodeableConcept value) { 
125      this.purpose = value;
126      return this;
127    }
128
129    /**
130     * @return {@link #name} (The name of an individual to contact, some types of contact detail are usually blank.)
131     */
132    public List<HumanName> getName() { 
133      if (this.name == null)
134        this.name = new ArrayList<HumanName>();
135      return this.name;
136    }
137
138    /**
139     * @return Returns a reference to <code>this</code> for easy method chaining
140     */
141    public ExtendedContactDetail setName(List<HumanName> theName) { 
142      this.name = theName;
143      return this;
144    }
145
146    public boolean hasName() { 
147      if (this.name == null)
148        return false;
149      for (HumanName item : this.name)
150        if (!item.isEmpty())
151          return true;
152      return false;
153    }
154
155    public HumanName addName() { //3
156      HumanName t = new HumanName();
157      if (this.name == null)
158        this.name = new ArrayList<HumanName>();
159      this.name.add(t);
160      return t;
161    }
162
163    public ExtendedContactDetail addName(HumanName t) { //3
164      if (t == null)
165        return this;
166      if (this.name == null)
167        this.name = new ArrayList<HumanName>();
168      this.name.add(t);
169      return this;
170    }
171
172    /**
173     * @return The first repetition of repeating field {@link #name}, creating it if it does not already exist {3}
174     */
175    public HumanName getNameFirstRep() { 
176      if (getName().isEmpty()) {
177        addName();
178      }
179      return getName().get(0);
180    }
181
182    /**
183     * @return {@link #telecom} (The contact details application for the purpose defined.)
184     */
185    public List<ContactPoint> getTelecom() { 
186      if (this.telecom == null)
187        this.telecom = new ArrayList<ContactPoint>();
188      return this.telecom;
189    }
190
191    /**
192     * @return Returns a reference to <code>this</code> for easy method chaining
193     */
194    public ExtendedContactDetail setTelecom(List<ContactPoint> theTelecom) { 
195      this.telecom = theTelecom;
196      return this;
197    }
198
199    public boolean hasTelecom() { 
200      if (this.telecom == null)
201        return false;
202      for (ContactPoint item : this.telecom)
203        if (!item.isEmpty())
204          return true;
205      return false;
206    }
207
208    public ContactPoint addTelecom() { //3
209      ContactPoint t = new ContactPoint();
210      if (this.telecom == null)
211        this.telecom = new ArrayList<ContactPoint>();
212      this.telecom.add(t);
213      return t;
214    }
215
216    public ExtendedContactDetail addTelecom(ContactPoint t) { //3
217      if (t == null)
218        return this;
219      if (this.telecom == null)
220        this.telecom = new ArrayList<ContactPoint>();
221      this.telecom.add(t);
222      return this;
223    }
224
225    /**
226     * @return The first repetition of repeating field {@link #telecom}, creating it if it does not already exist {3}
227     */
228    public ContactPoint getTelecomFirstRep() { 
229      if (getTelecom().isEmpty()) {
230        addTelecom();
231      }
232      return getTelecom().get(0);
233    }
234
235    /**
236     * @return {@link #address} (Address for the contact.)
237     */
238    public Address getAddress() { 
239      if (this.address == null)
240        if (Configuration.errorOnAutoCreate())
241          throw new Error("Attempt to auto-create ExtendedContactDetail.address");
242        else if (Configuration.doAutoCreate())
243          this.address = new Address(); // cc
244      return this.address;
245    }
246
247    public boolean hasAddress() { 
248      return this.address != null && !this.address.isEmpty();
249    }
250
251    /**
252     * @param value {@link #address} (Address for the contact.)
253     */
254    public ExtendedContactDetail setAddress(Address value) { 
255      this.address = value;
256      return this;
257    }
258
259    /**
260     * @return {@link #organization} (This contact detail is handled/monitored by a specific organization. If the name is provided in the contact, then it is referring to the named individual within this organization.)
261     */
262    public Reference getOrganization() { 
263      if (this.organization == null)
264        if (Configuration.errorOnAutoCreate())
265          throw new Error("Attempt to auto-create ExtendedContactDetail.organization");
266        else if (Configuration.doAutoCreate())
267          this.organization = new Reference(); // cc
268      return this.organization;
269    }
270
271    public boolean hasOrganization() { 
272      return this.organization != null && !this.organization.isEmpty();
273    }
274
275    /**
276     * @param value {@link #organization} (This contact detail is handled/monitored by a specific organization. If the name is provided in the contact, then it is referring to the named individual within this organization.)
277     */
278    public ExtendedContactDetail setOrganization(Reference value) { 
279      this.organization = value;
280      return this;
281    }
282
283    /**
284     * @return {@link #period} (Period that this contact was valid for usage.)
285     */
286    public Period getPeriod() { 
287      if (this.period == null)
288        if (Configuration.errorOnAutoCreate())
289          throw new Error("Attempt to auto-create ExtendedContactDetail.period");
290        else if (Configuration.doAutoCreate())
291          this.period = new Period(); // cc
292      return this.period;
293    }
294
295    public boolean hasPeriod() { 
296      return this.period != null && !this.period.isEmpty();
297    }
298
299    /**
300     * @param value {@link #period} (Period that this contact was valid for usage.)
301     */
302    public ExtendedContactDetail setPeriod(Period value) { 
303      this.period = value;
304      return this;
305    }
306
307      protected void listChildren(List<Property> children) {
308        super.listChildren(children);
309        children.add(new Property("purpose", "CodeableConcept", "The purpose/type of contact.", 0, 1, purpose));
310        children.add(new Property("name", "HumanName", "The name of an individual to contact, some types of contact detail are usually blank.", 0, java.lang.Integer.MAX_VALUE, name));
311        children.add(new Property("telecom", "ContactPoint", "The contact details application for the purpose defined.", 0, java.lang.Integer.MAX_VALUE, telecom));
312        children.add(new Property("address", "Address", "Address for the contact.", 0, 1, address));
313        children.add(new Property("organization", "Reference(Organization)", "This contact detail is handled/monitored by a specific organization. If the name is provided in the contact, then it is referring to the named individual within this organization.", 0, 1, organization));
314        children.add(new Property("period", "Period", "Period that this contact was valid for usage.", 0, 1, period));
315      }
316
317      @Override
318      public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
319        switch (_hash) {
320        case -220463842: /*purpose*/  return new Property("purpose", "CodeableConcept", "The purpose/type of contact.", 0, 1, purpose);
321        case 3373707: /*name*/  return new Property("name", "HumanName", "The name of an individual to contact, some types of contact detail are usually blank.", 0, java.lang.Integer.MAX_VALUE, name);
322        case -1429363305: /*telecom*/  return new Property("telecom", "ContactPoint", "The contact details application for the purpose defined.", 0, java.lang.Integer.MAX_VALUE, telecom);
323        case -1147692044: /*address*/  return new Property("address", "Address", "Address for the contact.", 0, 1, address);
324        case 1178922291: /*organization*/  return new Property("organization", "Reference(Organization)", "This contact detail is handled/monitored by a specific organization. If the name is provided in the contact, then it is referring to the named individual within this organization.", 0, 1, organization);
325        case -991726143: /*period*/  return new Property("period", "Period", "Period that this contact was valid for usage.", 0, 1, period);
326        default: return super.getNamedProperty(_hash, _name, _checkValid);
327        }
328
329      }
330
331      @Override
332      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
333        switch (hash) {
334        case -220463842: /*purpose*/ return this.purpose == null ? new Base[0] : new Base[] {this.purpose}; // CodeableConcept
335        case 3373707: /*name*/ return this.name == null ? new Base[0] : this.name.toArray(new Base[this.name.size()]); // HumanName
336        case -1429363305: /*telecom*/ return this.telecom == null ? new Base[0] : this.telecom.toArray(new Base[this.telecom.size()]); // ContactPoint
337        case -1147692044: /*address*/ return this.address == null ? new Base[0] : new Base[] {this.address}; // Address
338        case 1178922291: /*organization*/ return this.organization == null ? new Base[0] : new Base[] {this.organization}; // Reference
339        case -991726143: /*period*/ return this.period == null ? new Base[0] : new Base[] {this.period}; // Period
340        default: return super.getProperty(hash, name, checkValid);
341        }
342
343      }
344
345      @Override
346      public Base setProperty(int hash, String name, Base value) throws FHIRException {
347        switch (hash) {
348        case -220463842: // purpose
349          this.purpose = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
350          return value;
351        case 3373707: // name
352          this.getName().add(TypeConvertor.castToHumanName(value)); // HumanName
353          return value;
354        case -1429363305: // telecom
355          this.getTelecom().add(TypeConvertor.castToContactPoint(value)); // ContactPoint
356          return value;
357        case -1147692044: // address
358          this.address = TypeConvertor.castToAddress(value); // Address
359          return value;
360        case 1178922291: // organization
361          this.organization = TypeConvertor.castToReference(value); // Reference
362          return value;
363        case -991726143: // period
364          this.period = TypeConvertor.castToPeriod(value); // Period
365          return value;
366        default: return super.setProperty(hash, name, value);
367        }
368
369      }
370
371      @Override
372      public Base setProperty(String name, Base value) throws FHIRException {
373        if (name.equals("purpose")) {
374          this.purpose = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
375        } else if (name.equals("name")) {
376          this.getName().add(TypeConvertor.castToHumanName(value));
377        } else if (name.equals("telecom")) {
378          this.getTelecom().add(TypeConvertor.castToContactPoint(value));
379        } else if (name.equals("address")) {
380          this.address = TypeConvertor.castToAddress(value); // Address
381        } else if (name.equals("organization")) {
382          this.organization = TypeConvertor.castToReference(value); // Reference
383        } else if (name.equals("period")) {
384          this.period = TypeConvertor.castToPeriod(value); // Period
385        } else
386          return super.setProperty(name, value);
387        return value;
388      }
389
390  @Override
391  public void removeChild(String name, Base value) throws FHIRException {
392        if (name.equals("purpose")) {
393          this.purpose = null;
394        } else if (name.equals("name")) {
395          this.getName().remove(value);
396        } else if (name.equals("telecom")) {
397          this.getTelecom().remove(value);
398        } else if (name.equals("address")) {
399          this.address = null;
400        } else if (name.equals("organization")) {
401          this.organization = null;
402        } else if (name.equals("period")) {
403          this.period = null;
404        } else
405          super.removeChild(name, value);
406        
407      }
408
409      @Override
410      public Base makeProperty(int hash, String name) throws FHIRException {
411        switch (hash) {
412        case -220463842:  return getPurpose();
413        case 3373707:  return addName(); 
414        case -1429363305:  return addTelecom(); 
415        case -1147692044:  return getAddress();
416        case 1178922291:  return getOrganization();
417        case -991726143:  return getPeriod();
418        default: return super.makeProperty(hash, name);
419        }
420
421      }
422
423      @Override
424      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
425        switch (hash) {
426        case -220463842: /*purpose*/ return new String[] {"CodeableConcept"};
427        case 3373707: /*name*/ return new String[] {"HumanName"};
428        case -1429363305: /*telecom*/ return new String[] {"ContactPoint"};
429        case -1147692044: /*address*/ return new String[] {"Address"};
430        case 1178922291: /*organization*/ return new String[] {"Reference"};
431        case -991726143: /*period*/ return new String[] {"Period"};
432        default: return super.getTypesForProperty(hash, name);
433        }
434
435      }
436
437      @Override
438      public Base addChild(String name) throws FHIRException {
439        if (name.equals("purpose")) {
440          this.purpose = new CodeableConcept();
441          return this.purpose;
442        }
443        else if (name.equals("name")) {
444          return addName();
445        }
446        else if (name.equals("telecom")) {
447          return addTelecom();
448        }
449        else if (name.equals("address")) {
450          this.address = new Address();
451          return this.address;
452        }
453        else if (name.equals("organization")) {
454          this.organization = new Reference();
455          return this.organization;
456        }
457        else if (name.equals("period")) {
458          this.period = new Period();
459          return this.period;
460        }
461        else
462          return super.addChild(name);
463      }
464
465  public String fhirType() {
466    return "ExtendedContactDetail";
467
468  }
469
470      public ExtendedContactDetail copy() {
471        ExtendedContactDetail dst = new ExtendedContactDetail();
472        copyValues(dst);
473        return dst;
474      }
475
476      public void copyValues(ExtendedContactDetail dst) {
477        super.copyValues(dst);
478        dst.purpose = purpose == null ? null : purpose.copy();
479        if (name != null) {
480          dst.name = new ArrayList<HumanName>();
481          for (HumanName i : name)
482            dst.name.add(i.copy());
483        };
484        if (telecom != null) {
485          dst.telecom = new ArrayList<ContactPoint>();
486          for (ContactPoint i : telecom)
487            dst.telecom.add(i.copy());
488        };
489        dst.address = address == null ? null : address.copy();
490        dst.organization = organization == null ? null : organization.copy();
491        dst.period = period == null ? null : period.copy();
492      }
493
494      protected ExtendedContactDetail typedCopy() {
495        return copy();
496      }
497
498      @Override
499      public boolean equalsDeep(Base other_) {
500        if (!super.equalsDeep(other_))
501          return false;
502        if (!(other_ instanceof ExtendedContactDetail))
503          return false;
504        ExtendedContactDetail o = (ExtendedContactDetail) other_;
505        return compareDeep(purpose, o.purpose, true) && compareDeep(name, o.name, true) && compareDeep(telecom, o.telecom, true)
506           && compareDeep(address, o.address, true) && compareDeep(organization, o.organization, true) && compareDeep(period, o.period, true)
507          ;
508      }
509
510      @Override
511      public boolean equalsShallow(Base other_) {
512        if (!super.equalsShallow(other_))
513          return false;
514        if (!(other_ instanceof ExtendedContactDetail))
515          return false;
516        ExtendedContactDetail o = (ExtendedContactDetail) other_;
517        return true;
518      }
519
520      public boolean isEmpty() {
521        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(purpose, name, telecom, address
522          , organization, period);
523      }
524
525
526}
527