diff --git a/wnprc_billing/resources/domain-templates/ehr_billing.template.xml b/wnprc_billing/resources/domain-templates/ehr_billing.template.xml
index 6851deaa2..a8bc76b86 100644
--- a/wnprc_billing/resources/domain-templates/ehr_billing.template.xml
+++ b/wnprc_billing/resources/domain-templates/ehr_billing.template.xml
@@ -114,6 +114,10 @@
string
500
+
+ string
+ 500
+
diff --git a/wnprc_billing/resources/queries/ehr_billing/aliases.query.xml b/wnprc_billing/resources/queries/ehr_billing/aliases.query.xml
index d3d47a4f0..cab48c802 100644
--- a/wnprc_billing/resources/queries/ehr_billing/aliases.query.xml
+++ b/wnprc_billing/resources/queries/ehr_billing/aliases.query.xml
@@ -3,11 +3,17 @@
+
+
+
Grant Accounts
DETAILED
- Account Number
+
+ GrantWorkday
+
+ Grant
false
@@ -18,7 +24,7 @@
Y;N;
- Project Number
+ Grant
Grant Number
@@ -83,9 +89,24 @@
$###,##0.00
-
-
-
+
+
+ Fund
+
+ Fund
+
+
+
+ ledgerAccount
+
+ Ledger Account
+
+
+
+ costCenter
+
+ Cost Center
+
diff --git a/wnprc_billing/resources/queries/ehr_billing/aliases/.qview.xml b/wnprc_billing/resources/queries/ehr_billing/aliases/.qview.xml
index 9d28efb12..cdda8dff2 100644
--- a/wnprc_billing/resources/queries/ehr_billing/aliases/.qview.xml
+++ b/wnprc_billing/resources/queries/ehr_billing/aliases/.qview.xml
@@ -27,6 +27,8 @@
+
+
diff --git a/wnprc_billing/resources/queries/ehr_billing/aliasesTemplate.sql b/wnprc_billing/resources/queries/ehr_billing/aliasesTemplate.sql
new file mode 100644
index 000000000..bd2add501
--- /dev/null
+++ b/wnprc_billing/resources/queries/ehr_billing/aliasesTemplate.sql
@@ -0,0 +1,40 @@
+SELECT
+ al.alias AS grantWorkDay,
+ al.category AS category,
+ al.isAcceptingCharges AS isAcceptingCharges,
+ al.gencredits AS genCredits,
+ al.projectNumber AS Grant,
+ al.grantNumber AS grantNumber,
+ al.tier_rate AS tierRate,
+ al.type AS type,
+ al.budgetStartDate AS budgetStartDate,
+ al.budgetEndDate AS budgetEndDate,
+ al.investigatorName AS investigatorName,
+ al.investigatorId AS investigatorId,
+ al.fiscalAuthority AS fiscalAuthority,
+ al.affiliate AS affiliate,
+ al.contact_name AS contact_name,
+ al.contact_phone AS contact_phone,
+ al.contact_email AS contact_email,
+ --al.institution AS institution,
+ al.address AS address,
+ al.city AS city,
+ al.state AS state,
+ al.zip AS zip,
+ al.billing_contact_info AS billing_contact_info,
+ al.comments AS comments,
+ al.po_number AS po_number,
+ al.po_amount AS po_amount,
+ al.charge_grant_accounts_id AS charge_grant_accounts_id,
+ al.uw_fund AS fund,
+ al.uw_account AS ledgerAccount,
+ al.uw_udds AS costCenter,
+ al.uw_class_code AS uw_class_code,
+ al.grant_period_end AS grant_period_end,
+ al.order_cutoff AS order_cutoff,
+ al.successor_account AS successor_account,
+ al.predecessor_account AS predecessor_account,
+ al.mds_number AS mds_number,
+ al.faRate AS faRate,
+ al.faSchedule AS faSchedule
+FROM ehr_billing.aliases al
\ No newline at end of file
diff --git a/wnprc_billing/resources/queries/ehr_billing/invoiceRuns/.qview.xml b/wnprc_billing/resources/queries/ehr_billing/invoiceRuns/.qview.xml
index 49fe8ffb6..dccdccd51 100644
--- a/wnprc_billing/resources/queries/ehr_billing/invoiceRuns/.qview.xml
+++ b/wnprc_billing/resources/queries/ehr_billing/invoiceRuns/.qview.xml
@@ -16,6 +16,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/wnprc_billing/resources/queries/wnprc_billing/workdayInvoiceItems.query.xml b/wnprc_billing/resources/queries/wnprc_billing/workdayInvoiceItems.query.xml
new file mode 100644
index 000000000..4d53c1ab9
--- /dev/null
+++ b/wnprc_billing/resources/queries/wnprc_billing/workdayInvoiceItems.query.xml
@@ -0,0 +1,31 @@
+
+
+
+
+ CSV to Workday Preview
+
+
+ Cost Center
+
+
+
+ Function
+
+
+ Grant
+
+
+ Ledge Account
+
+
+ Extended Amount
+ 0.00
+
+
+ Catalog Item
+
+
+
+
+
+
\ No newline at end of file
diff --git a/wnprc_billing/resources/queries/wnprc_billing/workdayInvoiceItems.sql b/wnprc_billing/resources/queries/wnprc_billing/workdayInvoiceItems.sql
new file mode 100644
index 000000000..ff9f6b65c
--- /dev/null
+++ b/wnprc_billing/resources/queries/wnprc_billing/workdayInvoiceItems.sql
@@ -0,0 +1,27 @@
+SELECT
+ ii.invoiceId.rowId as runId,
+ a.uw_account as Project,
+ sum(ii.totalcost) as Amount,
+ replace(a.uw_udds, '-', '') as Department,
+ a.uw_fund as Fund,
+ ii.invoiceId.runDate AS document_date,
+ ii.invoiceId.comment AS memo,
+ a.charge_grant_accounts_Id as Account,
+ 'Primate Center ' || to_char(ii.invoiceId.billingPeriodStart,'MON') as Description,
+ to_char(ii.invoiceId.billingPeriodEnd, 'MMyy') as billingPeriodMMyy
+FROM
+ ehr_billing.invoicedItems ii
+ left join ehr_billing.aliases a
+ on ii.debitedAccount = a.alias
+ WHERE
+ lcase(a.type) like '%internal%' AND a.gencredits IS FALSE
+GROUP BY
+ ii.invoiceId.rowId,
+ a.uw_udds,
+ a.uw_fund,
+ a.uw_account,
+ a.charge_grant_accounts_Id,
+ ii.invoiceId.runDate,
+ ii.invoiceId.comment,
+ ii.invoiceId.billingPeriodStart,
+ ii.invoiceId.billingPeriodEnd
\ No newline at end of file
diff --git a/wnprc_billing/resources/queries/wnprc_billing/workdayInvoiceItems/.qview.xml b/wnprc_billing/resources/queries/wnprc_billing/workdayInvoiceItems/.qview.xml
new file mode 100644
index 000000000..c655b64ee
--- /dev/null
+++ b/wnprc_billing/resources/queries/wnprc_billing/workdayInvoiceItems/.qview.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/wnprc_billing/src/org/labkey/wnprc_billing/WNPRC_BillingController.java b/wnprc_billing/src/org/labkey/wnprc_billing/WNPRC_BillingController.java
index c79a9c662..c1a2de6e4 100644
--- a/wnprc_billing/src/org/labkey/wnprc_billing/WNPRC_BillingController.java
+++ b/wnprc_billing/src/org/labkey/wnprc_billing/WNPRC_BillingController.java
@@ -43,6 +43,7 @@
import org.labkey.api.util.StringUtilsLabKey;
import org.labkey.api.view.HttpView;
import org.labkey.api.view.NotFoundException;
+import org.labkey.pipeline.xml.impl.StringsImpl;
import org.labkey.wnprc_billing.domain.Alias;
import org.labkey.wnprc_billing.domain.Invoice;
import org.labkey.wnprc_billing.domain.InvoiceRun;
@@ -221,6 +222,7 @@ public void export(InvoiceRunForm invoiceRunForm, HttpServletResponse response,
{
String contentType = "text/plain";
JetCSV csv = getJetCsv(invoiceRunForm.getRunId());
+ JetCSV csvWD = getWorkdayCsv(invoiceRunForm.getRunId());
response.setContentType(contentType);
response.setHeader("Content-Disposition", "attachment; filename=\"" + csv.getFileName() + ".csv" + "\"");
response.setContentLength(csv.getCsvData().getBytes(StringUtilsLabKey.DEFAULT_CHARSET).length);
@@ -228,6 +230,21 @@ public void export(InvoiceRunForm invoiceRunForm, HttpServletResponse response,
}
}
+ @RequiresPermission(ReadPermission.class)
+ public class GetWorkdayInvoiceCSVAction extends ExportAction
+ {
+ @Override
+ public void export(InvoiceRunForm invoiceRunForm, HttpServletResponse response, BindException errors) throws Exception
+ {
+ String contentType = "text/plain";
+ JetCSV csvWD = getWorkdayCsv(invoiceRunForm.getRunId());
+ response.setContentType(contentType);
+ response.setHeader("Content-Disposition", "attachment; filename=\"" + csvWD.getFileName() + ".csv" + "\"");
+ response.setContentLength(csvWD.getCsvData().getBytes(StringUtilsLabKey.DEFAULT_CHARSET).length);
+ response.getOutputStream().write(csvWD.getCsvData().getBytes(StringUtilsLabKey.DEFAULT_CHARSET));
+ }
+ }
+
private JetCSV getJetCsv(int runId) throws IOException
{
List invoiceItems = getJetItems(runId);
@@ -299,6 +316,73 @@ private JetCSV getJetCsv(int runId) throws IOException
return new JetCSV(fileName,writer.toString());
}
+ private JetCSV getWorkdayCsv(int runId) throws IOException
+ {
+ List invoiceItems = getWorkItems(runId);
+ if (invoiceItems.isEmpty())
+ {
+ throw new NotFoundException("Unable to generate JET CSV. Invoiced Items not found for the selected invoice.");
+ }
+
+ InvoiceRun invoiceRun = getInvoiceRunById(runId);
+ StringWriter writer = new StringWriter();
+
+ Map moduleProperties = ModuleLoader.getInstance().getModule(WNPRC_BillingModule.class).getModuleProperties();
+ String jetSettingFromModuleProperty = moduleProperties.get(WNPRC_BillingModule.JetCsvSetting).getEffectiveValue(getContainer());
+ String[] jetSettings = jetSettingFromModuleProperty.split(",");
+
+
+ CSVWriter csvWriter = new CSVWriter(writer,CSVWriter.DEFAULT_SEPARATOR,CSVWriter.NO_QUOTE_CHARACTER);
+ csvWriter.writeNext(new String[]{"WorkDay Billing Export"});
+
+
+
+ String[] emptyLine = {""};
+ csvWriter.writeNext(emptyLine);
+ csvWriter.writeNext(new String[]{"Grant", "Extended Amount", "Cost Center", "Document Date", "Memo", "Fund"});
+
+ double sum = 0.0;
+ for (WorkDayInvoiceItem invoiceItem : invoiceItems)
+ {
+ csvWriter.writeNext(emptyLine);
+ csvWriter.writeNext(new String[]{
+ invoiceItem.project, //column 32
+ String.valueOf(invoiceItem.amount != null ? decimalFormat.format(invoiceItem.amount.doubleValue()) : 0.00),
+ invoiceItem.department,
+ invoiceItem.document_date,
+ invoiceItem.memo,
+ invoiceItem.Fund,
+ invoiceItem.description
+ });
+ sum += invoiceItem.amount != null ? invoiceItem.amount.doubleValue() : 0;
+ }
+
+ csvWriter.writeNext(emptyLine);
+ //last row in JET CSV with a negative total
+ csvWriter.writeNext(new String[]{
+ jetSettings[0], //Department
+ jetSettings[1], //Fund
+ jetSettings[2], //Program
+ jetSettings[3], //Project
+ null, //ActivityID
+ jetSettings[4], //Account,
+ null, //Class
+ String.valueOf(decimalFormat.format(sum * -1.0)), //Amount
+ invoiceItems.get(0).description, //Description, which is same for all the rows
+ (invoiceItems.get(0).document_date + jetSettings[3]), //Jnl_Ln_Ref. billingPeriodMMyy is same for all the rows
+ null, //PurchRefNo
+ null, //VoucherNo
+ null //InvoiceNo
+ });
+ csvWriter.writeNext(emptyLine);
+ csvWriter.close();
+
+ SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yy");
+ String fileName = "WorkDay_" + dateFormat.format(invoiceRun.getBillingPeriodStart()) + "_" +
+ dateFormat.format(invoiceRun.getBillingPeriodEnd());
+ return new JetCSV(fileName,writer.toString());
+ }
+
private class JetCSV{
private final String _fileName;
private final String _csvData;
@@ -329,6 +413,15 @@ private List getJetItems(int runId)
TableSelector tableSelector = new TableSelector(tableInfo, filter, null);
return tableSelector.getArrayList(JetInvoiceItem.class); }
+ private List getWorkItems(int runId)
+ {
+ UserSchema wnprc_billing = QueryService.get().getUserSchema(getUser(), getContainer(), WNPRC_BillingSchema.NAME);
+ TableInfo tableInfo = wnprc_billing.getTable(WNPRC_BillingSchema.TABLE_WORKDAY_INVOICE_ITEMS);
+
+ SimpleFilter filter = new SimpleFilter(FieldKey.fromParts("runId"), runId);
+ TableSelector tableSelector = new TableSelector(tableInfo, filter, null);
+ return tableSelector.getArrayList(WorkDayInvoiceItem.class); }
+
public static class InvoiceRunForm
{
int _runId;
@@ -502,6 +595,91 @@ public void setActivityID(String activityID)
}
}
+ public static class WorkDayInvoiceItem
+ {
+ int _runId;
+ String project;
+ Double amount;
+ String department;
+ String document_date;
+ String memo;
+ String Fund;
+ String description;
+
+ public String getDepartment()
+ {
+ return department;
+ }
+
+ public void setDepartment(String department)
+ {
+ this.department = department;
+ }
+
+ public String getDocument_date()
+ {
+ return document_date;
+ }
+
+ public void setDocument_date(String document_date)
+ {
+ this.document_date = document_date;
+ }
+
+ public String getMemo()
+ {
+ return memo;
+ }
+
+ public void setMemo(String memo)
+ {
+ this.memo = memo;
+ }
+
+ public String getFund()
+ {
+ return Fund;
+ }
+
+ public void setFund(String fund)
+ {
+ Fund = fund;
+ }
+
+ public String getDescription()
+ {
+ return description;
+ }
+
+ public void setDescription(String description)
+ {
+ this.description = description;
+ }
+
+ public Double getAmount()
+ {
+ return amount;
+ }
+
+ public void setAmount(Double amount)
+ {
+ this.amount = amount;
+ }
+
+ public String getProject()
+ {
+ return project;
+ }
+
+ public void setProject(String project)
+ {
+ this.project = project;
+ }
+
+
+
+ }
+
@RequiresPermission(ReadPermission.class)
public class DownloadInvoicesAction extends ExportAction
{
diff --git a/wnprc_billing/src/org/labkey/wnprc_billing/WNPRC_BillingSchema.java b/wnprc_billing/src/org/labkey/wnprc_billing/WNPRC_BillingSchema.java
index 47f55b3c2..78a54a224 100644
--- a/wnprc_billing/src/org/labkey/wnprc_billing/WNPRC_BillingSchema.java
+++ b/wnprc_billing/src/org/labkey/wnprc_billing/WNPRC_BillingSchema.java
@@ -33,6 +33,7 @@ public class WNPRC_BillingSchema
public static final String TABLE_TIER_RATES = "tierrates";
public static final String TABLE_GROUP_CATEGORY_ASSOCIATIONS = "groupCategoryAssociations";
public static final String TABLE_JET_INVOICE_ITEMS = "JetInvoiceItems";
+ public static final String TABLE_WORKDAY_INVOICE_ITEMS = "WorkdayInvoiceItems";
public static final String TABLE_ALIASES = "Aliases";
public static final String TABLE_SUMMARIZED_ITEMS = "summarizedInvoicedItemsByCategory";
diff --git a/wnprc_billing/src/org/labkey/wnprc_billing/WNPRC_InvoiceRunCustomizer.java b/wnprc_billing/src/org/labkey/wnprc_billing/WNPRC_InvoiceRunCustomizer.java
index ccc464f0a..bce86a9e1 100644
--- a/wnprc_billing/src/org/labkey/wnprc_billing/WNPRC_InvoiceRunCustomizer.java
+++ b/wnprc_billing/src/org/labkey/wnprc_billing/WNPRC_InvoiceRunCustomizer.java
@@ -15,6 +15,8 @@ public void customize(TableInfo tableInfo)
{
addViewJetInvoiceItems(tableInfo);
addDownloadCSV(tableInfo);
+ addViewWorkdayInvoiceItems(tableInfo);
+ addDownloadWorkdayCSV(tableInfo);
}
private void addViewJetInvoiceItems(TableInfo ti)
@@ -59,4 +61,46 @@ private void addDownloadCSV(TableInfo ti)
((AbstractTableInfo) ti).addColumn(wrappedColumnPDF);
}
}
+
+ private void addViewWorkdayInvoiceItems(TableInfo ti)
+ {
+ String colName = "viewWorkdayInvoice";
+
+ if (ti.getColumn(colName) == null)
+ {
+ WrappedColumn wrappedColumnPDF = new WrappedColumn(ti.getColumn("rowId"),colName);
+ wrappedColumnPDF.setHidden(false);
+ wrappedColumnPDF.setLabel("View Workday Invoice");
+
+ wrappedColumnPDF.setDisplayColumnFactory(colInfo -> {
+ String url = "/query/executeQuery.view?schemaName=wnprc_billing&" +
+ "query.queryName=workdayInvoiceItems&query.runId~eq=${rowId}";
+ UrlColumn urlColumn = new UrlColumn(DetailsURL.fromString(url, ti.getUserSchema().getContainer()), "View Workday");
+ urlColumn.setName(colName);
+ return urlColumn;
+ });
+ ((AbstractTableInfo) ti).addColumn(wrappedColumnPDF);
+ }
+ }
+ private void addDownloadWorkdayCSV(TableInfo ti)
+ {
+ String colName = "downloadWorkdayCsv";
+
+ if (ti.getColumn(colName) == null)
+ {
+ WrappedColumn wrappedColumnPDF = new WrappedColumn(ti.getColumn("rowId"),colName);
+ wrappedColumnPDF.setHidden(false);
+ wrappedColumnPDF.setLabel("Download Workday CSV");
+
+ wrappedColumnPDF.setDisplayColumnFactory(colInfo -> {
+ ActionURL url = new ActionURL(WNPRC_BillingController.GetWorkdayInvoiceCSVAction.class, ti.getUserSchema().getContainer());
+ url.addParameter("runId", "${rowId}");
+ UrlColumn urlColumn = new UrlColumn(url, "Download Workday CSV");
+ urlColumn.setName(colName);
+ return urlColumn;
+ });
+
+ ((AbstractTableInfo) ti).addColumn(wrappedColumnPDF);
+ }
+ }
}
diff --git a/wnprc_billing/src/org/labkey/wnprc_billing/invoice/InvoicePDF.java b/wnprc_billing/src/org/labkey/wnprc_billing/invoice/InvoicePDF.java
index c7612c4e7..aa553752f 100644
--- a/wnprc_billing/src/org/labkey/wnprc_billing/invoice/InvoicePDF.java
+++ b/wnprc_billing/src/org/labkey/wnprc_billing/invoice/InvoicePDF.java
@@ -584,10 +584,10 @@ private void addGrant() throws IOException
Line(new Coordinate(r1, mid), new Coordinate(r2, mid));
setXY(r1 + (r2 - r1) / 2 - 5, y1 + 3);
setFont("Helvetica", Collections.singleton(FontStyle.BOLD), 10);
- Cell(10, 2, "FUND-ACCOUNT", Alignment.CENTER);
+ Cell(10, 2, "GRANT", Alignment.CENTER);
setXY(r1 + (r2 - r1) / 2 - 5, y1 + 11);
setFont("Helvetica", Collections.emptySet(), 10);
- Cell(10, 2, addItem(alias.getUw_fund()) + alias.getGrantNumber(), Alignment.CENTER);
+ Cell(10, 2, alias.getGrantNumber(), Alignment.CENTER);
}
private void addPageNumber(int page) throws IOException