/**
* Copyright © ${project.inceptionYear} Instituto Superior Técnico
*
* This file is part of Fenix IST.
*
* Fenix IST is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Fenix IST is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Fenix IST. If not, see <http://www.gnu.org/licenses/>.
*/
/**
*
*/
package pt.ist.fenix.domain.student.importation;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Locale;
import org.apache.commons.lang.StringUtils;
import org.fenixedu.academic.domain.EntryPhase;
import org.fenixedu.academic.domain.ExecutionDegree;
import org.fenixedu.academic.domain.ExecutionYear;
import org.fenixedu.academic.domain.Person;
import org.fenixedu.academic.domain.candidacy.Ingression;
import org.fenixedu.academic.domain.contacts.MobilePhone;
import org.fenixedu.academic.domain.contacts.PartyContactType;
import org.fenixedu.academic.domain.contacts.Phone;
import org.fenixedu.academic.domain.contacts.PhysicalAddress;
import org.fenixedu.academic.domain.contacts.PhysicalAddressData;
import org.fenixedu.academic.domain.organizationalStructure.AcademicalInstitutionType;
import org.fenixedu.academic.domain.person.Gender;
import org.fenixedu.academic.domain.person.HumanName;
import org.fenixedu.academic.domain.person.IDDocumentType;
import org.fenixedu.academic.domain.person.MaritalStatus;
import org.fenixedu.academic.util.StringFormatter;
import org.fenixedu.bennu.core.domain.User;
import org.fenixedu.bennu.core.domain.UserProfile;
import org.fenixedu.spaces.domain.Space;
import org.joda.time.YearMonthDay;
import pt.utl.ist.fenix.tools.loaders.IFileLine;
import pt.utl.ist.fenix.tools.util.PhoneUtil;
public class DegreeCandidateDTO implements IFileLine {
private static final SimpleDateFormat DATE_FORMAT;
static {
DATE_FORMAT = new SimpleDateFormat("dd/MM/yyyy", new Locale("pt", "PT"));
DATE_FORMAT.setLenient(false);
}
private String degreeCode;
private String documentIdNumber;
private String documentCheckDigit;
private String name;
private String address;
private String areaCode;
private String areaOfAreaCode;
private String phoneNumber;
private Gender gender;
private YearMonthDay dateOfBirth;
private String contigent;
private Ingression ingression;
private Integer placingOption;
private String highSchoolFinalGrade;
private Double entryGrade;
private String highSchoolName;
private AcademicalInstitutionType highSchoolType;
private String highSchoolDegreeDesignation;
private EntryPhase entryPhase;
private String istUniversity;
@Override
public String toString() {
final StringBuilder result = new StringBuilder();
printField(result, "Degree Code", this.degreeCode);
printField(result, "Document ID", this.documentIdNumber);
printField(result, "Document Check Digit", this.documentCheckDigit);
printField(result, "Name", this.name);
printField(result, "Address", this.address);
printField(result, "Area Code", this.areaCode);
printField(result, "Area of Area Code", this.areaOfAreaCode);
printField(result, "Phone", this.phoneNumber);
printField(result, "Gender ", this.gender.name());
printField(result, "Date Of Birth", this.dateOfBirth.toString("dd-MM-yyyy"));
printField(result, "Contigent", this.contigent);
printField(result, "Ingression", this.ingression.name());
printField(result, "Placing Option", this.placingOption.toString());
printField(result, "Highschool Final Grade", this.highSchoolFinalGrade);
printField(result, "Entry Grade", this.entryGrade.toString());
printField(result, "Highschool Name", this.highSchoolName);
printField(result, "Highschool Type", this.highSchoolType.name());
printField(result, "Degree Designation", this.highSchoolDegreeDesignation);
printField(result, "Entry Phase", this.entryPhase.toString());
printField(result, "Ist University", this.istUniversity);
return result.toString();
}
private void printField(final StringBuilder result, final String name, final String value) {
result.append(name).append(":").append(value).append("\n");
}
public DegreeCandidateDTO() {
}
/**
* <pre>
*
* EstabCol(0) CursoCol (cods old)(1) NumBI(2) LocBI(3) Descr loc BI(4) Check Digit(5) Nome(6) Morada1(7)
* Morada2(8) Codpos(9) Codpos3(10) CodLocal(11) Telefone(12) Sexo(13) DataNasc(dd-MMM-yy)(14)
* Conting(15) PrefCol (op ingresso)(16) EtapCol(17) Media12(18) NotaCand(19) cod_escola_sec(20)
* escola_sec(21) tipo_estab_sec(22) curso_secundario(23)
*
* </pre>
*/
@Override
public boolean fillWithFileLineData(String dataLine) {
if (StringUtils.isEmpty(dataLine.trim()) || dataLine.startsWith("#")) {
return false;
}
final String[] fields = dataLine.split("\t");
this.degreeCode = fields[1].trim();
this.documentIdNumber = fields[2].trim();
this.documentCheckDigit = fields[5].trim();
this.name = fields[6].trim();
this.address = fields[7].trim() + " " + fields[8].trim();
this.areaCode = fields[9].trim() + "-" + fields[10].trim();
this.areaOfAreaCode = fields[11].trim();
this.phoneNumber = fields[12].trim();
this.gender = String2Gender.convert(fields[13].trim());
this.dateOfBirth = parseDate(fields[14].trim());
this.contigent = fields[15].trim();
this.ingression = DgesBaseProcess.CONTINGENT_TO_INGRESSION_CONVERSION.get(this.contigent);
this.placingOption = Integer.valueOf(fields[16].trim());
this.highSchoolFinalGrade = new BigDecimal(fields[18].trim()).divide(BigDecimal.valueOf(10)).toPlainString();
this.entryGrade = new BigDecimal(fields[19].trim().replace(',', '.')).doubleValue();
this.highSchoolName = fields[21].trim();
this.highSchoolType = parseHighSchoolType(fields[22].trim());
this.highSchoolDegreeDesignation = fields[23].trim();
return true;
}
private AcademicalInstitutionType parseHighSchoolType(final String value) {
if (value.equals("PRI")) {
return AcademicalInstitutionType.PRIVATE_HIGH_SCHOOL;
} else if (value.equals("PUB")) {
return AcademicalInstitutionType.PUBLIC_HIGH_SCHOOL;
} else {
throw new RuntimeException("Unexpected high school type");
}
}
private YearMonthDay parseDate(final String value) {
try {
return YearMonthDay.fromDateFields(DATE_FORMAT.parse(value));
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
@Override
public String getUniqueKey() {
return this.documentIdNumber;
}
public String getDegreeCode() {
return degreeCode;
}
public void setDegreeCode(String degreeCode) {
this.degreeCode = degreeCode;
}
public String getDocumentIdNumber() {
return documentIdNumber;
}
public void setDocumentIdNumber(String documentIdNumber) {
this.documentIdNumber = documentIdNumber;
}
public String getDocumentCheckDigit() {
return documentCheckDigit;
}
public void setDocumentCheckDigit(String documentCheckDigit) {
this.documentCheckDigit = documentCheckDigit;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getAreaCode() {
return areaCode;
}
public void setAreaCode(String areaCode) {
this.areaCode = areaCode;
}
public String getAreaOfAreaCode() {
return areaOfAreaCode;
}
public void setAreaOfAreaCode(String areaOfAreaCode) {
this.areaOfAreaCode = areaOfAreaCode;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
public YearMonthDay getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(YearMonthDay dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
public String getContigent() {
return contigent;
}
public void setContigent(String contigent) {
this.contigent = contigent;
}
public Ingression getIngression() {
return ingression;
}
public void setIngression(Ingression ingression) {
this.ingression = ingression;
}
public Integer getPlacingOption() {
return placingOption;
}
public void setPlacingOption(Integer placingOption) {
this.placingOption = placingOption;
}
public String getHighSchoolFinalGrade() {
return highSchoolFinalGrade;
}
public void setHighSchoolFinalGrade(String highSchoolFinalGrade) {
this.highSchoolFinalGrade = highSchoolFinalGrade;
}
public Double getEntryGrade() {
return entryGrade;
}
public void setEntryGrade(Double entryGrade) {
this.entryGrade = entryGrade;
}
public String getHighSchoolName() {
return highSchoolName;
}
public void setHighSchoolName(String highSchoolName) {
this.highSchoolName = highSchoolName;
}
public AcademicalInstitutionType getHighSchoolType() {
return highSchoolType;
}
public void setHighSchoolType(AcademicalInstitutionType highSchoolType) {
this.highSchoolType = highSchoolType;
}
public String getHighSchoolDegreeDesignation() {
return highSchoolDegreeDesignation;
}
public void setHighSchoolDegreeDesignation(String highSchoolDegreeDesignation) {
this.highSchoolDegreeDesignation = highSchoolDegreeDesignation;
}
public EntryPhase getEntryPhase() {
return entryPhase;
}
public void setEntryPhase(EntryPhase entryPhase) {
this.entryPhase = entryPhase;
}
public String getIstUniversity() {
return istUniversity;
}
public void setIstUniversity(String istUniversity) {
this.istUniversity = istUniversity;
}
public Person getMatchingPerson() throws MatchingPersonException {
Collection<Person> persons = Person.readByDocumentIdNumber(getDocumentIdNumber());
if (persons.isEmpty()) {
throw new NotFoundPersonException();
}
if (persons.size() > 1) {
throw new TooManyMatchedPersonsException();
}
final Person person = persons.iterator().next();
if (person.getDateOfBirthYearMonthDay() != null && person.getDateOfBirthYearMonthDay().equals(getDateOfBirth())) {
return person;
}
if (person.getName().equals(getName())) {
return person;
}
throw new NotFoundPersonException();
}
public Person createPerson(String username) {
HumanName split = HumanName.decompose(StringFormatter.prettyPrint(getName()), false);
UserProfile profile = new UserProfile(split.getGivenNames(), split.getFamilyNames(), null, null, null);
new User(username, profile);
final Person person = new Person(profile);
person.setGender(getGender());
person.setIdentification(getDocumentIdNumber(), IDDocumentType.IDENTITY_CARD);
person.setMaritalStatus(MaritalStatus.SINGLE);
person.setDateOfBirthYearMonthDay(getDateOfBirth());
person.setIdentificationDocumentSeriesNumber(getDocumentCheckDigit());
final PhysicalAddress createPhysicalAddress =
PhysicalAddress.createPhysicalAddress(person, new PhysicalAddressData(getAddress(), getAreaCode(),
getAreaOfAreaCode(), null), PartyContactType.PERSONAL, true);
createPhysicalAddress.setValid();
if (PhoneUtil.isMobileNumber(getPhoneNumber())) {
final MobilePhone createMobilePhone =
MobilePhone.createMobilePhone(person, getPhoneNumber(), PartyContactType.PERSONAL, true);
createMobilePhone.setValid();
} else {
final Phone createPhone = Phone.createPhone(person, getPhoneNumber(), PartyContactType.PERSONAL, true);
createPhone.setValid();
}
return person;
}
public ExecutionDegree getExecutionDegree(final ExecutionYear executionYear, final Space campus) {
return ExecutionDegree.readByDegreeCodeAndExecutionYearAndCampus(getDegreeCode(), executionYear, campus);
}
public static abstract class MatchingPersonException extends Exception {
/**
*
*/
private static final long serialVersionUID = 1L;
}
public static class NotFoundPersonException extends MatchingPersonException {
/**
*
*/
private static final long serialVersionUID = 1L;
}
public static class TooManyMatchedPersonsException extends MatchingPersonException {
/**
*
*/
private static final long serialVersionUID = 1L;
}
}