From e204dc3c466cc6207532a4c4c67ee67e2c8a76b5 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Fri, 24 Feb 2017 19:03:53 +0100
Subject: [PATCH] java parser for prc controls added

---
 .../appointment/parse/PrcControlParser.java   | 156 ++++++++++++++++++
 .../appointment/parse/PrcFlyingParser.java    |   9 +-
 .../appointment/parse/PrcSubjectsParser.java  |   6 +-
 .../appointment/parse/SubjectParser.java      |  12 ++
 .../parse/PrcControlParserTest.java           |  59 +++++++
 .../testFiles/prcControlesExample.xlsx        | Bin 0 -> 9506 bytes
 6 files changed, 229 insertions(+), 13 deletions(-)
 create mode 100644 appointment-import/src/main/java/smash/appointment/parse/PrcControlParser.java
 create mode 100644 appointment-import/src/test/java/smash/appointment/parse/PrcControlParserTest.java
 create mode 100644 appointment-import/testFiles/prcControlesExample.xlsx

diff --git a/appointment-import/src/main/java/smash/appointment/parse/PrcControlParser.java b/appointment-import/src/main/java/smash/appointment/parse/PrcControlParser.java
new file mode 100644
index 00000000..44496a88
--- /dev/null
+++ b/appointment-import/src/main/java/smash/appointment/parse/PrcControlParser.java
@@ -0,0 +1,156 @@
+package smash.appointment.parse;
+
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+
+public class PrcControlParser extends SubjectParser {
+
+	@Override
+	protected String parseScreeningNumber(Row row) {
+		String number = getString(row.getCell(16));
+		if (number.isEmpty()) {
+			return "";
+		} else {
+			return "P-" + number;
+		}
+	}
+
+	@Override
+	protected String parseName(Row row) {
+		return getString(row.getCell(1));
+	}
+
+	@Override
+	protected String parseSurname(Row row) {
+		return getString(row.getCell(0));
+	}
+
+	@Override
+	protected String parseNdNumber(Row row) {
+		return getString(row.getCell(14));
+	}
+
+	@Override
+	protected String getSheetName() {
+		return "Contrôles";
+	}
+
+	@Override
+	protected int getInitRow() {
+		return 1;
+	}
+
+	@Override
+	protected String parseBirthDate(Row row) {
+		return "";
+	}
+
+	@Override
+	protected String parsemPowerId(Row row) {
+		return "";
+	}
+
+	@Override
+	protected String parseAddDate(Row row) {
+		return getDate(row.getCell(8));
+	}
+
+	@Override
+	protected String parseReferal(Row row) {
+		return "";
+	}
+
+	@Override
+	protected String parseDiagnosisYear(Row row) {
+		return "";
+	}
+
+	@Override
+	protected String parseMail(Row row) {
+		return getString(row.getCell(5));
+	}
+
+	@Override
+	protected String parsePhone3(Row row) {
+		String phones[] = getPhones(row);
+		if (phones.length > 2) {
+			return phones[2].trim();
+		}
+		return "";
+	}
+
+	private String[] getPhones(Row row) {
+		return getString(row.getCell(4)).split("/");
+	}
+
+	@Override
+	protected String parsePhone2(Row row) {
+		String phones[] = getPhones(row);
+		if (phones.length > 1) {
+			return phones[1].trim();
+		}
+		return "";
+	}
+
+	@Override
+	protected String parsePhone1(Row row) {
+		String phones[] = getPhones(row);
+		return phones[0].trim();
+	}
+
+	@Override
+	protected String parseCity(Row row) {
+		String string = getString(row.getCell(3));
+		int spaceIndex = string.indexOf(" ");
+		if (spaceIndex > 0) {
+			return string.substring(spaceIndex).trim();
+		}
+		return string;
+	}
+
+	@Override
+	protected String parseCountry(Row row) {
+		return "";
+	}
+
+	@Override
+	protected String parseZipCode(Row row) {
+		String string = getString(row.getCell(3));
+		int spaceIndex = string.indexOf(" ");
+		if (spaceIndex > 0) {
+			return string.substring(0,spaceIndex);
+		}
+		return "";
+	}
+
+	@Override
+	protected String parseAddress(Row row) {
+		return getString(row.getCell(2));
+	}
+
+	@Override
+	protected String parseRemarks(Row row) {
+		String remark1 = getString(row.getCell(9));
+		String remark2 = "";
+
+		String result = "";
+		if (!remark1.trim().isEmpty()) {
+			result = result + remark1 + "\n";
+		}
+		if (!remark2.trim().isEmpty()) {
+			result = result + remark2 + "\n";
+		}
+		return result;
+	}
+
+	@Override
+	protected String parseDiagnosis(Row row) {
+		return "";
+	}
+
+	@Override
+	protected SubjectType parseType(Row row) {
+		return SubjectType.CONTROL;
+	}
+
+}
diff --git a/appointment-import/src/main/java/smash/appointment/parse/PrcFlyingParser.java b/appointment-import/src/main/java/smash/appointment/parse/PrcFlyingParser.java
index f96a40bf..5e27552d 100644
--- a/appointment-import/src/main/java/smash/appointment/parse/PrcFlyingParser.java
+++ b/appointment-import/src/main/java/smash/appointment/parse/PrcFlyingParser.java
@@ -42,14 +42,7 @@ public class PrcFlyingParser extends SubjectParser {
 
 	@Override
 	protected String parseBirthDate(Row row) {
-		String date = getString(row.getCell(27)).replaceAll(" ", "");
-		if (date.length() < 8) {
-			return "";
-		}
-		String year = date.substring(0, 4);
-		String month = date.substring(4, 6);
-		String day = date.substring(6, 8);
-		return year + "-" + month + "-" + day;
+		return parseDateOfBirth(row.getCell(27));
 	}
 
 	@Override
diff --git a/appointment-import/src/main/java/smash/appointment/parse/PrcSubjectsParser.java b/appointment-import/src/main/java/smash/appointment/parse/PrcSubjectsParser.java
index 21a38c19..7b76573f 100644
--- a/appointment-import/src/main/java/smash/appointment/parse/PrcSubjectsParser.java
+++ b/appointment-import/src/main/java/smash/appointment/parse/PrcSubjectsParser.java
@@ -37,11 +37,7 @@ public class PrcSubjectsParser extends SubjectParser {
 
 	@Override
 	protected String parseBirthDate(Row row) {
-		String date = getString(row.getCell(27)).replaceAll(" ", "");
-		String year = date.substring(0, 4);
-		String month = date.substring(4, 6);
-		String day = date.substring(6, 8);
-		return year + "-" + month + "-" + day;
+		return parseDateOfBirth(row.getCell(27));
 	}
 
 	@Override
diff --git a/appointment-import/src/main/java/smash/appointment/parse/SubjectParser.java b/appointment-import/src/main/java/smash/appointment/parse/SubjectParser.java
index bb69f0bf..d3fe996c 100644
--- a/appointment-import/src/main/java/smash/appointment/parse/SubjectParser.java
+++ b/appointment-import/src/main/java/smash/appointment/parse/SubjectParser.java
@@ -153,4 +153,16 @@ public abstract class SubjectParser {
 		return result;
 	}
 
+	protected String parseDateOfBirth(Cell cell) {
+		String date = getString(cell).replaceAll(" ", "");
+		if (date.length() < 8) {
+			return "";
+		}
+		String year = date.substring(0, 4);
+		String month = date.substring(4, 6);
+		String day = date.substring(6, 8);
+		String result = year + "-" + month + "-" + day;
+		return result;
+	}
+
 }
diff --git a/appointment-import/src/test/java/smash/appointment/parse/PrcControlParserTest.java b/appointment-import/src/test/java/smash/appointment/parse/PrcControlParserTest.java
new file mode 100644
index 00000000..9558de7c
--- /dev/null
+++ b/appointment-import/src/test/java/smash/appointment/parse/PrcControlParserTest.java
@@ -0,0 +1,59 @@
+package smash.appointment.parse;
+
+import static org.junit.Assert.*;
+
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.Test;
+
+public class PrcControlParserTest extends TestBase {
+	Logger						logger		= Logger.getLogger(PrcSubjectsParserTest.class);
+
+	PrcControlParser processor	= new PrcControlParser();
+
+
+	@AfterClass
+	public static void tearDownAfterClass() throws Exception {
+	}
+
+	@Before
+	public void setUp()  {
+		super.setUp();
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void test() throws Exception {
+		List<Subject> entries = processor.processExcel("testFiles/prcControlesExample.xlsx");
+		assertTrue(entries.size() > 0);
+
+		Subject subject = entries.get(0);
+		assertEquals("P-333", subject.getScreeningNumber());
+		assertEquals("CCC", subject.getName());
+		assertEquals("BBB", subject.getSurname());
+		assertTrue(subject.getRemarks().contains("note"));
+		assertEquals("DDD", subject.getAddress());
+		assertEquals("L-2423", subject.getZipCode());
+		assertEquals("Luxembourg", subject.getCity());
+		assertEquals("", subject.getCountry());
+		assertEquals("123", subject.getPhone1());
+		assertEquals("456", subject.getPhone2());
+		assertEquals("789", subject.getPhone3());
+		assertEquals("mail@mail.lu", subject.getMail());
+		assertEquals("", subject.getDiagnosisYear());
+		assertEquals("", subject.getDiagnosis());
+		assertEquals("", subject.getReferal());
+		assertEquals("2016-03-29", subject.getAddDate());
+		assertEquals("ND3333", subject.getNdNumber());
+		assertEquals("", subject.getBirthDate());
+	}
+
+
+}
diff --git a/appointment-import/testFiles/prcControlesExample.xlsx b/appointment-import/testFiles/prcControlesExample.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..2277978b4984e2871171b48d30d06cc32d9ee31e
GIT binary patch
literal 9506
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
E2i!DcCjbBd

literal 0
HcmV?d00001

-- 
GitLab