Details
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/util/AuditChecker.java b/beatrix/src/test/java/org/killbill/billing/beatrix/util/AuditChecker.java
index 82b590b..619c255 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/util/AuditChecker.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/util/AuditChecker.java
@@ -156,12 +156,12 @@ public class AuditChecker {
public void checkInvoiceCreated(final Invoice invoice, final CallContext context) {
final List<AuditLog> invoiceLogs = getAuditLogForInvoice(invoice, context);
//Assert.assertEquals(invoiceLogs.size(), 1);
- checkAuditLog(ChangeType.INSERT, context, invoiceLogs.get(0), invoice.getId(), InvoiceSqlDao.class, false, false);
+ checkAuditLog(ChangeType.INSERT, context, invoiceLogs.get(0), invoice.getId(), InvoiceSqlDao.class, true, false);
for (InvoiceItem cur : invoice.getInvoiceItems()) {
final List<AuditLog> auditLogs = getAuditLogForInvoiceItem(cur, context);
Assert.assertTrue(auditLogs.size() >= 1);
- checkAuditLog(ChangeType.INSERT, context, auditLogs.get(0), cur.getId(), InvoiceItemSqlDao.class, false, false);
+ checkAuditLog(ChangeType.INSERT, context, auditLogs.get(0), cur.getId(), InvoiceItemSqlDao.class, true, false);
}
}
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceItemModelDao.java b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceItemModelDao.java
index c036a76..07c5bc8 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceItemModelDao.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceItemModelDao.java
@@ -398,6 +398,6 @@ public class InvoiceItemModelDao extends EntityModelDaoBase implements EntityMod
@Override
public TableName getHistoryTableName() {
- return null;
+ return TableName.INVOICE_ITEM_HISTORY;
}
}
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceModelDao.java b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceModelDao.java
index b3f5602..ad021c5 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceModelDao.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceModelDao.java
@@ -183,6 +183,11 @@ public class InvoiceModelDao extends EntityModelDaoBase implements EntityModelDa
return isWrittenOff;
}
+ // Make BeanInspector happy when invoked from EntityHistoryBinder
+ public boolean getIsWrittenOff() {
+ return isWrittenOff;
+ }
+
public void setIsWrittenOff(final boolean isWrittenOff) {
this.isWrittenOff = isWrittenOff;
}
@@ -303,7 +308,7 @@ public class InvoiceModelDao extends EntityModelDaoBase implements EntityModelDa
@Override
public TableName getHistoryTableName() {
- return null;
+ return TableName.INVOICE_HISTORY;
}
}
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoicePaymentModelDao.java b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoicePaymentModelDao.java
index 53cbf16..2b76d19 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoicePaymentModelDao.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoicePaymentModelDao.java
@@ -228,6 +228,6 @@ public class InvoicePaymentModelDao extends EntityModelDaoBase implements Entity
@Override
public TableName getHistoryTableName() {
- return null;
+ return TableName.INVOICE_PAYMENT_HISTORY;
}
}
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceTrackingModelDao.java b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceTrackingModelDao.java
index 178b464..59ac342 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceTrackingModelDao.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/dao/InvoiceTrackingModelDao.java
@@ -156,7 +156,7 @@ public class InvoiceTrackingModelDao extends EntityModelDaoBase implements Entit
@Override
public TableName getHistoryTableName() {
- return null;
+ return TableName.INVOICE_TRACKING_ID_HISTORY;
}
}
diff --git a/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceItemSqlDao.sql.stg b/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceItemSqlDao.sql.stg
index 1a25b85..0aa5427 100644
--- a/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceItemSqlDao.sql.stg
+++ b/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceItemSqlDao.sql.stg
@@ -1,6 +1,7 @@
import "org/killbill/billing/util/entity/dao/EntitySqlDao.sql.stg"
tableName() ::= "invoice_items"
+historyTableName() ::= "invoice_item_history"
tableFields(prefix) ::= <<
<prefix>type
diff --git a/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoicePaymentSqlDao.sql.stg b/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoicePaymentSqlDao.sql.stg
index 23776fa..728c847 100644
--- a/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoicePaymentSqlDao.sql.stg
+++ b/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoicePaymentSqlDao.sql.stg
@@ -1,6 +1,7 @@
import "org/killbill/billing/util/entity/dao/EntitySqlDao.sql.stg"
tableName() ::= "invoice_payments"
+historyTableName() ::= "invoice_payment_history"
tableFields(prefix) ::= <<
<prefix>type
diff --git a/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceSqlDao.sql.stg b/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceSqlDao.sql.stg
index 304ef0e..12e578a 100644
--- a/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceSqlDao.sql.stg
+++ b/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceSqlDao.sql.stg
@@ -1,6 +1,7 @@
import "org/killbill/billing/util/entity/dao/EntitySqlDao.sql.stg"
tableName() ::= "invoices"
+historyTableName() ::= "invoice_history"
tableFields(prefix) ::= <<
<prefix>account_id
diff --git a/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceTrackingSqlDao.sql.stg b/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceTrackingSqlDao.sql.stg
index b20293a..b67b442 100644
--- a/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceTrackingSqlDao.sql.stg
+++ b/invoice/src/main/resources/org/killbill/billing/invoice/dao/InvoiceTrackingSqlDao.sql.stg
@@ -1,6 +1,7 @@
import "org/killbill/billing/util/entity/dao/EntitySqlDao.sql.stg"
tableName() ::= "invoice_tracking_ids"
+historyTableName() ::= "invoice_tracking_id_history"
tableFields(prefix) ::= <<
<prefix>tracking_id
diff --git a/invoice/src/main/resources/org/killbill/billing/invoice/ddl.sql b/invoice/src/main/resources/org/killbill/billing/invoice/ddl.sql
index a9f6763..68ab207 100644
--- a/invoice/src/main/resources/org/killbill/billing/invoice/ddl.sql
+++ b/invoice/src/main/resources/org/killbill/billing/invoice/ddl.sql
@@ -22,6 +22,29 @@ CREATE INDEX invoice_tracking_tenant_account_date_idx ON invoice_tracking_ids(te
CREATE INDEX invoice_tracking_invoice_id_idx ON invoice_tracking_ids(invoice_id);
+DROP TABLE IF EXISTS invoice_tracking_id_history;
+CREATE TABLE invoice_tracking_id_history (
+ record_id serial unique,
+ id varchar(36) NOT NULL,
+ target_record_id bigint /*! unsigned */ not null,
+ tracking_id varchar(128) NOT NULL,
+ invoice_id varchar(36) NOT NULL,
+ subscription_id varchar(36),
+ unit_type varchar(255) NOT NULL,
+ record_date date NOT NULL,
+ is_active boolean default true,
+ change_type varchar(6) NOT NULL,
+ created_by varchar(50) NOT NULL,
+ created_date datetime NOT NULL,
+ updated_by varchar(50) NOT NULL,
+ updated_date datetime NOT NULL,
+ account_record_id bigint /*! unsigned */ not null,
+ tenant_record_id bigint /*! unsigned */ not null default 0,
+ PRIMARY KEY(record_id)
+) /*! CHARACTER SET utf8 COLLATE utf8_bin */;
+CREATE INDEX invoice_tracking_id_history_target_record_id ON invoice_tracking_id_history(target_record_id);
+CREATE INDEX invoice_tracking_id_history_tenant_record_id ON invoice_tracking_id_history(tenant_record_id);
+
DROP TABLE IF EXISTS invoice_items;
CREATE TABLE invoice_items (
record_id serial unique,
@@ -58,6 +81,43 @@ CREATE INDEX invoice_items_account_id ON invoice_items(account_id ASC);
CREATE INDEX invoice_items_linked_item_id ON invoice_items(linked_item_id ASC);
CREATE INDEX invoice_items_tenant_account_record_id ON invoice_items(tenant_record_id, account_record_id);
+
+DROP TABLE IF EXISTS invoice_item_history;
+CREATE TABLE invoice_item_history (
+ record_id serial unique,
+ id varchar(36) NOT NULL,
+ target_record_id bigint /*! unsigned */ not null,
+ type varchar(24) NOT NULL,
+ invoice_id varchar(36) NOT NULL,
+ account_id varchar(36) NOT NULL,
+ child_account_id varchar(36),
+ bundle_id varchar(36),
+ subscription_id varchar(36),
+ description varchar(255),
+ product_name varchar(255),
+ plan_name varchar(255),
+ phase_name varchar(255),
+ usage_name varchar(255),
+ start_date date,
+ end_date date,
+ amount numeric(15,9) NOT NULL,
+ rate numeric(15,9) NULL,
+ currency varchar(3) NOT NULL,
+ linked_item_id varchar(36),
+ quantity int,
+ item_details text,
+ change_type varchar(6) NOT NULL,
+ created_by varchar(50) NOT NULL,
+ created_date datetime NOT NULL,
+ account_record_id bigint /*! unsigned */ not null,
+ tenant_record_id bigint /*! unsigned */ not null default 0,
+ PRIMARY KEY(record_id)
+) /*! CHARACTER SET utf8 COLLATE utf8_bin */;
+CREATE INDEX invoice_item_history_target_record_id ON invoice_item_history(target_record_id);
+CREATE INDEX invoice_item_history_tenant_record_id ON invoice_item_history(tenant_record_id);
+
+
+
DROP TABLE IF EXISTS invoices;
CREATE TABLE invoices (
record_id serial unique,
@@ -79,6 +139,30 @@ CREATE UNIQUE INDEX invoices_id ON invoices(id);
CREATE INDEX invoices_account ON invoices(account_id ASC);
CREATE INDEX invoices_tenant_account_record_id ON invoices(tenant_record_id, account_record_id);
+
+DROP TABLE IF EXISTS invoice_history;
+CREATE TABLE invoice_history (
+ record_id serial unique,
+ id varchar(36) NOT NULL,
+ target_record_id bigint /*! unsigned */ not null,
+ account_id varchar(36) NOT NULL,
+ invoice_date date NOT NULL,
+ target_date date,
+ currency varchar(3) NOT NULL,
+ status varchar(15) NOT NULL DEFAULT 'COMMITTED',
+ migrated bool NOT NULL,
+ parent_invoice bool NOT NULL DEFAULT FALSE,
+ change_type varchar(6) NOT NULL,
+ created_by varchar(50) NOT NULL,
+ created_date datetime NOT NULL,
+ account_record_id bigint /*! unsigned */ not null,
+ tenant_record_id bigint /*! unsigned */ not null default 0,
+ PRIMARY KEY(record_id)
+) /*! CHARACTER SET utf8 COLLATE utf8_bin */;
+CREATE INDEX invoice_history_target_record_id ON invoice_history(target_record_id);
+CREATE INDEX invoice_history_tenant_record_id ON invoice_history(tenant_record_id);
+
+
DROP TABLE IF EXISTS invoice_payments;
CREATE TABLE invoice_payments (
record_id serial unique,
@@ -106,6 +190,32 @@ CREATE INDEX invoice_payments_payment_id ON invoice_payments(payment_id);
CREATE INDEX invoice_payments_payment_cookie_id ON invoice_payments(payment_cookie_id);
CREATE INDEX invoice_payments_tenant_account_record_id ON invoice_payments(tenant_record_id, account_record_id);
+DROP TABLE IF EXISTS invoice_payment_history;
+CREATE TABLE invoice_payment_history (
+ record_id serial unique,
+ id varchar(36) NOT NULL,
+ target_record_id bigint /*! unsigned */ not null,
+ type varchar(24) NOT NULL,
+ invoice_id varchar(36) NOT NULL,
+ payment_id varchar(36),
+ payment_date datetime NOT NULL,
+ amount numeric(15,9) NOT NULL,
+ currency varchar(3) NOT NULL,
+ processed_currency varchar(3) NOT NULL,
+ payment_cookie_id varchar(255) DEFAULT NULL,
+ linked_invoice_payment_id varchar(36) DEFAULT NULL,
+ success bool DEFAULT true,
+ change_type varchar(6) NOT NULL,
+ created_by varchar(50) NOT NULL,
+ created_date datetime NOT NULL,
+ account_record_id bigint /*! unsigned */ not null,
+ tenant_record_id bigint /*! unsigned */ not null default 0,
+ PRIMARY KEY(record_id)
+) /*! CHARACTER SET utf8 COLLATE utf8_bin */;
+CREATE INDEX invoice_payment_history_target_record_id ON invoice_payment_history(target_record_id);
+CREATE INDEX invoice_payment_history_tenant_record_id ON invoice_payment_history(tenant_record_id);
+
+
DROP TABLE IF EXISTS invoice_parent_children;
CREATE TABLE invoice_parent_children (
record_id serial unique,
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceTrackingSqlDao.java b/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceTrackingSqlDao.java
index 8c42ce5..bef1051 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceTrackingSqlDao.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceTrackingSqlDao.java
@@ -140,7 +140,11 @@ public class TestInvoiceTrackingSqlDao extends InvoiceTestSuiteWithEmbeddedDB {
final List<InvoiceTrackingModelDao> result = dao.getTrackingsByDateRange(startRange.toDate(), endRange.toDate(), internalCallContext);
Assert.assertEquals(result.size(), 4);
- final List<AuditLogModelDao> auditLogsPostCreate = ImmutableList.<AuditLogModelDao>copyOf(dao.getAuditLogsForTableNameAndAccountRecordId(TableName.INVOICE_TRACKING_IDS.toString(), internalCallContext));
+ final List<AuditLogModelDao> auditLogsPostCreate = new ArrayList<>();
+ for (int i = 0; i < 4; i++) {
+ List<AuditLogModelDao> tmp = dao.getAuditLogsViaHistoryForTargetRecordId(TableName.INVOICE_TRACKING_ID_HISTORY.name(), TableName.INVOICE_TRACKING_ID_HISTORY.getTableName().toLowerCase(), result.get(i).getRecordId(), internalCallContext);
+ auditLogsPostCreate.addAll(tmp);
+ }
Assert.assertEquals(auditLogsPostCreate.size(), 4);
for (int i = 0; i < 4; i++) {
Assert.assertEquals(auditLogsPostCreate.get(i).getChangeType(), ChangeType.INSERT);
@@ -166,16 +170,20 @@ public class TestInvoiceTrackingSqlDao extends InvoiceTestSuiteWithEmbeddedDB {
final List<InvoiceTrackingModelDao> result2 = dao.getTrackingsByDateRange(startRange.toDate(), endRange.toDate(), internalCallContext);
Assert.assertEquals(result2.size(), 1);
- final List<AuditLogModelDao> auditLogsPostDelete = ImmutableList.<AuditLogModelDao>copyOf(dao.getAuditLogsForTableNameAndAccountRecordId(TableName.INVOICE_TRACKING_IDS.toString(), internalCallContext));
- Assert.assertEquals(auditLogsPostDelete.size(), 7);
+ final List<AuditLogModelDao> auditLogsPostDelete = new ArrayList<>();
for (int i = 0; i < 4; i++) {
- Assert.assertEquals(auditLogsPostDelete.get(i).getChangeType(), ChangeType.INSERT);
- Assert.assertEquals(auditLogsPostDelete.get(i).getTargetRecordId(), result.get(i).getRecordId());
+ List<AuditLogModelDao> tmp = dao.getAuditLogsViaHistoryForTargetRecordId(TableName.INVOICE_TRACKING_ID_HISTORY.name(), TableName.INVOICE_TRACKING_ID_HISTORY.getTableName().toLowerCase(), result.get(i).getRecordId(), internalCallContext);
+ auditLogsPostDelete.addAll(tmp);
}
- for (int i = 4; i < 7; i++) {
- Assert.assertEquals(auditLogsPostDelete.get(i).getChangeType(), ChangeType.DELETE);
- Assert.assertEquals(auditLogsPostDelete.get(i).getTargetRecordId(), result.get(i - 4).getRecordId());
+
+ Assert.assertEquals(auditLogsPostDelete.size(), 7);
+ // First 3 records will show an INSERT & DELETE
+ for (int i = 0; i < 3; i++) {
+ Assert.assertEquals(auditLogsPostDelete.get(2*i).getChangeType(), ChangeType.INSERT);
+ Assert.assertEquals(auditLogsPostDelete.get(2*i + 1).getChangeType(), ChangeType.DELETE);
}
+ // Last record will only show an INSERT
+ Assert.assertEquals(auditLogsPostDelete.get(6).getChangeType(), ChangeType.INSERT);
return null;
}
diff --git a/util/src/main/java/org/killbill/billing/util/dao/TableName.java b/util/src/main/java/org/killbill/billing/util/dao/TableName.java
index f4158c9..54d7810 100644
--- a/util/src/main/java/org/killbill/billing/util/dao/TableName.java
+++ b/util/src/main/java/org/killbill/billing/util/dao/TableName.java
@@ -34,10 +34,14 @@ public enum TableName {
BLOCKING_STATES("blocking_states", ObjectType.BLOCKING_STATES, BLOCKING_STATE_HISTORY),
CUSTOM_FIELD_HISTORY("custom_field_history"),
CUSTOM_FIELD("custom_fields", ObjectType.CUSTOM_FIELD, CUSTOM_FIELD_HISTORY),
- INVOICE_ITEMS("invoice_items", ObjectType.INVOICE_ITEM),
- INVOICE_PAYMENTS("invoice_payments", ObjectType.INVOICE_PAYMENT),
- INVOICES("invoices", ObjectType.INVOICE),
- INVOICE_TRACKING_IDS("invoice_tracking_ids"),
+ INVOICE_ITEM_HISTORY("invoice_item_history"),
+ INVOICE_ITEMS("invoice_items", ObjectType.INVOICE_ITEM, INVOICE_ITEM_HISTORY),
+ INVOICE_PAYMENT_HISTORY("invoice_payment_history"),
+ INVOICE_PAYMENTS("invoice_payments", ObjectType.INVOICE_PAYMENT, INVOICE_PAYMENT_HISTORY),
+ INVOICE_HISTORY("invoice_history"),
+ INVOICES("invoices", ObjectType.INVOICE, INVOICE_HISTORY),
+ INVOICE_TRACKING_ID_HISTORY("invoice_tracking_id_history"),
+ INVOICE_TRACKING_IDS("invoice_tracking_ids", null, INVOICE_TRACKING_ID_HISTORY),
INVOICE_PARENT_CHILDREN("invoice_parent_children"),
NODE_INFOS("node_infos"),
PAYMENT_ATTEMPT_HISTORY("payment_attempt_history"),
diff --git a/util/src/main/java/org/killbill/billing/util/entity/dao/EntitySqlDao.java b/util/src/main/java/org/killbill/billing/util/entity/dao/EntitySqlDao.java
index d9aa68f..e63c68a 100644
--- a/util/src/main/java/org/killbill/billing/util/entity/dao/EntitySqlDao.java
+++ b/util/src/main/java/org/killbill/billing/util/entity/dao/EntitySqlDao.java
@@ -61,14 +61,18 @@ public interface EntitySqlDao<M extends EntityModelDao<E>, E extends Entity> ext
@SmartBindBean final InternalCallContext context);
@SqlQuery
- public M getById(@Bind("id") final String id,
- @SmartBindBean final InternalTenantContext context);
-
- @SqlQuery
public M getByRecordId(@Bind("recordId") final Long recordId,
@SmartBindBean final InternalTenantContext context);
@SqlQuery
+ public List<M> getByRecordIds(@BindIn("recordIds") final Collection<Long> recordId,
+ @SmartBindBean final InternalTenantContext context);
+
+ @SqlQuery
+ public M getById(@Bind("id") final String id,
+ @SmartBindBean final InternalTenantContext context);
+
+ @SqlQuery
List<M> getByIds(@BindIn("ids") final Collection<String> ids,
@SmartBindBean final InternalTenantContext context);
diff --git a/util/src/main/resources/org/killbill/billing/util/entity/dao/EntitySqlDao.sql.stg b/util/src/main/resources/org/killbill/billing/util/entity/dao/EntitySqlDao.sql.stg
index 0a9d423..e3c59da 100644
--- a/util/src/main/resources/org/killbill/billing/util/entity/dao/EntitySqlDao.sql.stg
+++ b/util/src/main/resources/org/killbill/billing/util/entity/dao/EntitySqlDao.sql.stg
@@ -189,6 +189,17 @@ where <recordIdField("t.")> = :recordId
;
>>
+getByRecordIds(recordIds) ::= <<
+select
+<allTableFields("t.")>
+from <tableName()> t
+where <recordIdField("t.")> in (<recordIds>)
+<andCheckSoftDeletionWithComma("t.")>
+<AND_CHECK_TENANT("t.")>
+;
+>>
+
+
getByIds(ids) ::= <<
select
<allTableFields("t.")>