package service;
import api.v1.ForecastSearchParams;
import api.v1.ForecastSearchResult;
import api.v1.InvoiceData;
import mapper.ForecastMapper;
import mapper.ForecastSearchResultMapper;
import models.ForecastModel;
import models.InvoiceLine;
import org.joda.time.DateTime;
import org.junit.Test;
import util.InMemoryDbTest;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
public class InvoiceGeneratorServiceTest extends InMemoryDbTest {
@Test
public void testGenerateInvoice() {
InvoiceGeneratorService service = new InvoiceGeneratorService(fakeUser);
DateTime now = new DateTime(2016,2,28,12,32);
service.setNow(now);
List<InvoiceLine> invoiceLines = new ArrayList<>();
InvoiceLine line1 = new InvoiceLine("1",
"1601",
"20161601",
"Leif/222",
"PO1",
"MET1",
"T",
"Vær vennlig å oppgi fakturanummer ved betaling",
"",
"",
0,
0);
InvoiceLine line2 = new InvoiceLine("1",
"1601",
"20161601",
"Leif/222",
"PO1",
"MET1",
"",
"Oppstartsgebyr",
"840",
"3505",
1,
900);
InvoiceLine line3 = new InvoiceLine("1",
"1601",
"20161601",
"Leif/222",
"PO1",
"MET1",
"",
"Varsel for P1 fra 20151201 til 20151231",
"840",
"80111",
14,
250);
invoiceLines.add(line1);
invoiceLines.add(line2);
invoiceLines.add(line3);
String result = service.generateInvoice(invoiceLines);
assertNotNull("resultat er null", result);
String[] lines = result.split("\n");
assertNotNull("linjer i csv er null",lines);
assertEquals("Antall linjer i csv fil er ikke som forventet",4,lines.length);
String[] fieldsLine1 = lines[1].split("\t");
assertNotNull("Felter i linje 1 er null",fieldsLine1);
assertEquals("BREAK er ikke tom", "", fieldsLine1[0]);
assertEquals("FORETAK er ikke MET", "MET", fieldsLine1[1]);
assertEquals("RESKNR/kunnenr er ikke 1", "1", fieldsLine1[2]);
assertEquals("PERIODE stemmer ikke", "1601", fieldsLine1[3]);
assertEquals("BILDATO stemmer ikke", "20161601", fieldsLine1[4]);
assertEquals("FORDATO er ikke tom", "", fieldsLine1[5]);
assertEquals("BETBET er ikke tom", "", fieldsLine1[6]);
assertEquals("VARREF stemmer ikke", "Leif/222", fieldsLine1[7]);
assertEquals("KUNREF stemmer ikke", "PO1", fieldsLine1[8]);
assertEquals("ORDRE/metref stemmer ikke", "MET1", fieldsLine1[9]);
assertEquals("VARENR stemmer ikke", "T", fieldsLine1[10]);
assertEquals("TEXT stemmer ikke", "Vær vennlig å oppgi fakturanummer ved betaling", fieldsLine1[11]);
assertEquals("LKTODEL2 er ikke tom", "", fieldsLine1[12]);
assertEquals("LKTODEL3 er ikke tom", "", fieldsLine1[13]);
assertEquals("LKTODEL6 er ikke tom", "", fieldsLine1[14]);
assertEquals("VALKODE er ikke tom", "", fieldsLine1[15]);
assertEquals("ANTALL er ikke tom", "0", fieldsLine1[16]);
assertEquals("SATS er ikke tom", "0" +
"", fieldsLine1[17]);
String[] fieldsLine2 = lines[2].split("\t");
assertEquals("BREAK er ikke tom", "", fieldsLine2[0]);
assertEquals("FORETAK er ikke MET", "MET", fieldsLine2[1]);
assertEquals("RESKNR/kunnenr er ikke 1", "1", fieldsLine2[2]);
assertEquals("PERIODE stemmer ikke", "1601", fieldsLine2[3]);
assertEquals("BILDATO stemmer ikke", "20161601", fieldsLine2[4]);
assertEquals("FORDATO er ikke tom", "", fieldsLine2[5]);
assertEquals("BETBET er ikke tom", "", fieldsLine2[6]);
assertEquals("VARREF stemmer ikke", "Leif/222", fieldsLine2[7]);
assertEquals("KUNREF stemmer ikke", "PO1", fieldsLine2[8]);
assertEquals("ORDRE/metref stemmer ikke", "MET1", fieldsLine2[9]);
assertEquals("VARENR stemmer ikke", "", fieldsLine2[10]);
assertEquals("TEXT stemmer ikke", "Oppstartsgebyr", fieldsLine2[11]);
assertEquals("LKTODEL2 stemmer ikke", "840", fieldsLine2[12]);
assertEquals("LKTODEL3 er ikke tom", "3505", fieldsLine2[13]);
assertEquals("LKTODEL6 er ikke tom", "", fieldsLine2[14]);
assertEquals("VALKODE er ikke tom", "", fieldsLine2[15]);
assertEquals("ANTALL stemmer ikke", "1", fieldsLine2[16]);
assertEquals("SATS stemmer ikke", "900", fieldsLine2[17]);
String[] fieldsLine3 = lines[3].split("\t");
assertEquals("BREAK er ikke tom", "", fieldsLine3[0]);
assertEquals("FORETAK er ikke MET", "MET", fieldsLine3[1]);
assertEquals("RESKNR/kunnenr er ikke 1", "1", fieldsLine3[2]);
assertEquals("PERIODE stemmer ikke", "1601", fieldsLine3[3]);
assertEquals("BILDATO stemmer ikke", "20161601", fieldsLine3[4]);
assertEquals("FORDATO er ikke tom", "", fieldsLine3[5]);
assertEquals("BETBET er ikke tom", "", fieldsLine3[6]);
assertEquals("VARREF stemmer ikke", "Leif/222", fieldsLine3[7]);
assertEquals("KUNREF stemmer ikke", "PO1", fieldsLine3[8]);
assertEquals("ORDRE/metref stemmer ikke", "MET1", fieldsLine3[9]);
assertEquals("VARENR stemmer ikke", "", fieldsLine3[10]);
assertEquals("TEXT stemmer ikke", "Varsel for P1 fra 20151201 til 20151231", fieldsLine3[11]);
assertEquals("LKTODEL2 stemmer ikke", "840", fieldsLine3[12]);
assertEquals("LKTODEL3 er ikke tom", "80111", fieldsLine3[13]);
assertEquals("LKTODEL6 er ikke tom", "", fieldsLine3[14]);
assertEquals("VALKODE er ikke tom", "", fieldsLine3[15]);
assertEquals("ANTALL stemmer ikke", "14", fieldsLine3[16]);
assertEquals("SATS stemmer ikke", "250", fieldsLine3[17]);
}
@Test
public void testGenerateInvoiceLines(){
InvoiceGeneratorService service = new InvoiceGeneratorService(fakeUser);
InvoiceData invoiceData = new InvoiceData();
invoiceData.filename = "abc";
invoiceData.forecasts = new ForecastSearchResult[1];
ForecastSearchResult forecastSearchResult = new ForecastSearchResult();
forecastSearchResult.customer_contactname = "Kundens kontaktnavn";
forecastSearchResult.customer_name = "Kundens navn";
forecastSearchResult.custref_contractnum = "Kundens kontraktsnummer";
forecastSearchResult.custref_email = "Kundens epost";
forecastSearchResult.custref_po_calloff = "Kundens PO";
forecastSearchResult.end_date = new DateTime(2016,2,18,12,0,0).toDate();
forecastSearchResult.invoiced = false;
forecastSearchResult.met_ref ="1234321";
forecastSearchResult.position_alias ="Kundens navn på posisjonen";
forecastSearchResult.position_name ="METS navn på posisjonen";
forecastSearchResult.produced_forecasts = 14;
forecastSearchResult.start_date = new DateTime(2016,2,4,12,0,0).toDate();
invoiceData.forecasts[0] = forecastSearchResult;
DateTime now = new DateTime(2016,2,28,12,32);
service.setNow(now);
List<InvoiceLine> invoiceLines = service.generateInvoiceLines(invoiceData, "Leif/222");
assertNotNull("InvoiceLines is null", invoiceLines);
assertEquals("Antall invoiceLines stememr ikke",2,invoiceLines.size());
InvoiceLine oppfordringsLinje = invoiceLines.get(0);
assertEquals("Brudd er ikke tomt","",oppfordringsLinje.brudd);
SimpleDateFormat sdfBilldate = new SimpleDateFormat("yyyyddMM");
String expectedBilDato = sdfBilldate.format(service.getNow().toDate());
assertEquals("Bildato stemmer ikke", expectedBilDato,oppfordringsLinje.bildato);
assertEquals("Foretak stemmer ikke","MET",oppfordringsLinje.foretak);
assertEquals("kunref stemmer ikke","121212123",oppfordringsLinje.kunref);
assertEquals("lktodel2 stemmer ikke","",oppfordringsLinje.lktodel2);
assertEquals("lktodel3 stemmer ikke","",oppfordringsLinje.lktodel3);
assertEquals("ordre stemmer ikke","1234321",oppfordringsLinje.ordre);
assertEquals("periode stemmer ikke","1602",oppfordringsLinje.periode);
assertEquals("resknr stemmer ikke","3",oppfordringsLinje.resknr);
assertEquals("tekst stemmer ikke","Vær vennlig å oppgi fakturanummer ved betaling",oppfordringsLinje.tekst);
assertEquals("varenr stemmer ikke","T",oppfordringsLinje.varenr);
assertEquals("varref stemmer ikke","Leif/222",oppfordringsLinje.varref);
InvoiceLine varselLinje = invoiceLines.get(1);
assertEquals("Brudd er ikke tomt","",varselLinje.brudd);
assertEquals("Bildato stemmer ikke", expectedBilDato,varselLinje.bildato);
assertEquals("Foretak stemmer ikke","MET",varselLinje.foretak);
assertEquals("kunref stemmer ikke","121212123",varselLinje.kunref);
assertEquals("lktodel2 stemmer ikke","K2 verdi",varselLinje.lktodel2);
assertEquals("lktodel3 stemmer ikke","K3 verdi",varselLinje.lktodel3);
assertEquals("ordre stemmer ikke","1234321",varselLinje.ordre);
assertEquals("periode stemmer ikke","1602",varselLinje.periode);
assertEquals("resknr stemmer ikke","3",varselLinje.resknr);
SimpleDateFormat sdfPeriode = new SimpleDateFormat("yyMM");
String periode = sdfPeriode.format(service.getNow().toDate());
String expectedText = "Varsel for Echofish fom. " + periode + " tom. " + periode;
assertEquals("tekst stemmer ikke",expectedText,varselLinje.tekst);
assertEquals("varenr stemmer ikke","",varselLinje.varenr);
assertEquals("varref stemmer ikke","Leif/222",varselLinje.varref);
}
@Test
public void testMarkForecastsAsBilled(){
ForecastModel forecastModel = ForecastModel.find.byId(1L);
assertEquals("forecast er allerede markert som fakturert",false,forecastModel.invoiced);
boolean forecastFound = false;
ForecastService forecastService = new ForecastService(fakeUser);
ForecastSearchParams params = new ForecastSearchParams();
List<models.ForecastSearchResult> searchResults = forecastService.search(params);
assertNotNull("search result : null", searchResults);
assertEquals("Feil antall varsler i søk",2,searchResults.size());
InvoiceGeneratorService service = new InvoiceGeneratorService(fakeUser);
ForecastSearchResultMapper mapper = new ForecastSearchResultMapper();
List<ForecastSearchResult> apiSearchResults = mapper.mapToApi(searchResults);
service.markForecastsAsBilled(apiSearchResults.toArray(new ForecastSearchResult[searchResults.size()]));
for (ForecastSearchResult apiSearchResult : apiSearchResults) {
List<ForecastModel> models = ForecastModel.findByMetrefAndDateRange(apiSearchResult.met_ref, apiSearchResult.start_date, apiSearchResult.end_date);
assertNotNull("models er null", models);
assertEquals("Feil antall forecatsModel",1,models.size());
for (ForecastModel model : models) {
if ( model.equals(forecastModel)) {
assertEquals("model.invoiced er ikke riktig", true, model.invoiced);
forecastFound = true;
}
}
}
assertEquals("Varsel ble ikke funnet",true,forecastFound);
}
}