killbill-memoizeit

invoice: add missing audit entries Signed-off-by: Pierre-Alexandre

9/24/2012 7:02:55 PM

Details

diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/AuditedInvoiceDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/AuditedInvoiceDao.java
index c4033f5..d8c7442 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/AuditedInvoiceDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/AuditedInvoiceDao.java
@@ -328,6 +328,7 @@ public class AuditedInvoiceDao implements InvoiceDao {
         invoiceSqlDao.inTransaction(new Transaction<Void, InvoiceSqlDao>() {
             @Override
             public Void inTransaction(final InvoiceSqlDao transactional, final TransactionStatus status) throws Exception {
+                // Note: the tagUserApi is audited
                 tagUserApi.addTag(invoiceId, ObjectType.INVOICE, ControlTagType.WRITTEN_OFF.getId(), context);
 
                 final Invoice invoice = transactional.getById(invoiceId.toString());
@@ -343,6 +344,7 @@ public class AuditedInvoiceDao implements InvoiceDao {
         invoiceSqlDao.inTransaction(new Transaction<Void, InvoiceSqlDao>() {
             @Override
             public Void inTransaction(final InvoiceSqlDao transactional, final TransactionStatus status) throws Exception {
+                // Note: the tagUserApi is audited
                 tagUserApi.removeTag(invoiceId, ObjectType.INVOICE, ControlTagType.WRITTEN_OFF.getId(), context);
 
                 final Invoice invoice = transactional.getById(invoiceId.toString());
@@ -361,6 +363,7 @@ public class AuditedInvoiceDao implements InvoiceDao {
         return invoicePaymentSqlDao.inTransaction(new Transaction<InvoicePayment, InvoicePaymentSqlDao>() {
             @Override
             public InvoicePayment inTransaction(final InvoicePaymentSqlDao transactional, final TransactionStatus status) throws Exception {
+                final List<EntityAudit> audits = new ArrayList<EntityAudit>();
 
                 final InvoiceSqlDao transInvoiceDao = transactional.become(InvoiceSqlDao.class);
 
@@ -388,6 +391,8 @@ public class AuditedInvoiceDao implements InvoiceDao {
                                                                         payment.getInvoiceId(), context.getCreatedDate(), requestedPositiveAmount.negate(),
                                                                         payment.getCurrency(), paymentCookieId, payment.getId());
                 transactional.create(refund, context);
+                final Long refundRecordId = transactional.getRecordId(refund.getId().toString());
+                audits.add(new EntityAudit(TableName.REFUNDS, refundRecordId, ChangeType.INSERT));
 
                 // Retrieve invoice after the Refund
                 final Invoice invoice = transInvoiceDao.getById(payment.getInvoiceId().toString());
@@ -410,6 +415,8 @@ public class AuditedInvoiceDao implements InvoiceDao {
                     if (requestedPositiveAmountToAdjust.compareTo(BigDecimal.ZERO) > 0) {
                         final InvoiceItem adjItem = new RefundAdjInvoiceItem(invoice.getId(), invoice.getAccountId(), context.getCreatedDate().toLocalDate(), requestedPositiveAmountToAdjust.negate(), invoice.getCurrency());
                         transInvoiceItemDao.create(adjItem, context);
+                        final Long adjItemRecordId = transInvoiceItemDao.getRecordId(adjItem.getId().toString());
+                        audits.add(new EntityAudit(TableName.INVOICE_ITEMS, adjItemRecordId, ChangeType.INSERT));
                     }
                 } else if (isInvoiceAdjusted) {
                     // Invoice item adjustment
@@ -418,12 +425,17 @@ public class AuditedInvoiceDao implements InvoiceDao {
                         final InvoiceItem item = createAdjustmentItem(transInvoiceDao, invoice.getId(), invoiceItemId, adjAmount,
                                                                       invoice.getCurrency(), context.getCreatedDate().toLocalDate());
                         transInvoiceItemDao.create(item, context);
+                        final Long itemRecordId = transInvoiceItemDao.getRecordId(item.getId().toString());
+                        audits.add(new EntityAudit(TableName.INVOICE_ITEMS, itemRecordId, ChangeType.INSERT));
                     }
                 }
 
                 // Notify the bus since the balance of the invoice changed
                 notifyBusOfInvoiceAdjustment(transactional, invoice.getId(), invoice.getAccountId(), context.getUserToken());
 
+                // Save audit logs
+                transactional.insertAuditFromTransaction(audits, context);
+
                 return refund;
             }
         });
@@ -584,11 +596,16 @@ public class AuditedInvoiceDao implements InvoiceDao {
         return invoiceSqlDao.inTransaction(new Transaction<InvoiceItem, InvoiceSqlDao>() {
             @Override
             public InvoiceItem inTransaction(final InvoiceSqlDao transactional, final TransactionStatus status) throws Exception {
+                final List<EntityAudit> audits = new ArrayList<EntityAudit>();
+
                 UUID invoiceIdForExternalCharge = invoiceId;
                 // Create an invoice for that external charge if it doesn't exist
                 if (invoiceIdForExternalCharge == null) {
                     final Invoice invoiceForExternalCharge = new DefaultInvoice(accountId, effectiveDate, effectiveDate, currency);
                     transactional.create(invoiceForExternalCharge, context);
+                    final Long invoiceRecordId = transactional.getRecordId(invoiceForExternalCharge.getId().toString());
+                    audits.add(new EntityAudit(TableName.INVOICES, invoiceRecordId, ChangeType.INSERT));
+
                     invoiceIdForExternalCharge = invoiceForExternalCharge.getId();
                 }
 
@@ -598,6 +615,8 @@ public class AuditedInvoiceDao implements InvoiceDao {
 
                 final InvoiceItemSqlDao transInvoiceItemDao = transactional.become(InvoiceItemSqlDao.class);
                 transInvoiceItemDao.create(externalCharge, context);
+                final Long invoiceItemRecordId = transInvoiceItemDao.getRecordId(externalCharge.getId().toString());
+                audits.add(new EntityAudit(TableName.INVOICE_ITEMS, invoiceItemRecordId, ChangeType.INSERT));
 
                 // At this point, reread the invoice and figure out if we need to consume some of the CBA
                 final Invoice invoice = transactional.getById(invoiceIdForExternalCharge.toString());
@@ -611,10 +630,16 @@ public class AuditedInvoiceDao implements InvoiceDao {
                     final BigDecimal cbaAmountToConsume = accountCbaAvailable.compareTo(invoice.getBalance()) > 0 ? invoice.getBalance().negate() : accountCbaAvailable.negate();
                     final InvoiceItem cbaAdjItem = new CreditBalanceAdjInvoiceItem(invoice.getId(), invoice.getAccountId(), context.getCreatedDate().toLocalDate(), cbaAmountToConsume, invoice.getCurrency());
                     transInvoiceItemDao.create(cbaAdjItem, context);
+                    final Long cbaAdjItemRecordId = transInvoiceItemDao.getRecordId(cbaAdjItem.getId().toString());
+                    audits.add(new EntityAudit(TableName.INVOICE_ITEMS, cbaAdjItemRecordId, ChangeType.INSERT));
                 }
 
                 // Notify the bus since the balance of the invoice changed
                 notifyBusOfInvoiceAdjustment(transactional, invoiceId, accountId, context.getUserToken());
+
+                // Save audit logs
+                transactional.insertAuditFromTransaction(audits, context);
+
                 return externalCharge;
             }
         });
@@ -631,25 +656,29 @@ public class AuditedInvoiceDao implements InvoiceDao {
         return invoiceSqlDao.inTransaction(new Transaction<InvoiceItem, InvoiceSqlDao>() {
             @Override
             public InvoiceItem inTransaction(final InvoiceSqlDao transactional, final TransactionStatus status) throws Exception {
+                final List<EntityAudit> audits = new ArrayList<EntityAudit>();
+
                 UUID invoiceIdForCredit = invoiceId;
                 // Create an invoice for that credit if it doesn't exist
                 if (invoiceIdForCredit == null) {
                     final Invoice invoiceForCredit = new DefaultInvoice(accountId, effectiveDate, effectiveDate, currency);
                     transactional.create(invoiceForCredit, context);
+                    final Long invoiceForCreditRecordId = transactional.getRecordId(invoiceForCredit.getId().toString());
+                    audits.add(new EntityAudit(TableName.INVOICES, invoiceForCreditRecordId, ChangeType.INSERT));
+
                     invoiceIdForCredit = invoiceForCredit.getId();
                 }
 
                 // Note! The amount is negated here!
                 final InvoiceItem credit = new CreditAdjInvoiceItem(invoiceIdForCredit, accountId, effectiveDate, positiveCreditAmount.negate(), currency);
-                final Long recordId = insertItemAndAddCBAIfNeeded(transactional, credit, context);
-
-                // Add audit
-                final EntityAudit audit = new EntityAudit(TableName.INVOICE_ITEMS, recordId, ChangeType.INSERT);
-                transactional.insertAuditFromTransaction(audit, context);
+                insertItemAndAddCBAIfNeeded(transactional, credit, audits, context);
 
                 // Notify the bus since the balance of the invoice changed
                 notifyBusOfInvoiceAdjustment(transactional, invoiceId, accountId, context.getUserToken());
 
+                // Save audit logs
+                transactional.insertAuditFromTransaction(audits, context);
+
                 return credit;
             }
         });
@@ -662,12 +691,16 @@ public class AuditedInvoiceDao implements InvoiceDao {
         return invoiceSqlDao.inTransaction(new Transaction<InvoiceItem, InvoiceSqlDao>() {
             @Override
             public InvoiceItem inTransaction(final InvoiceSqlDao transactional, final TransactionStatus status) throws Exception {
+                final List<EntityAudit> audits = new ArrayList<EntityAudit>();
                 final InvoiceItem invoiceItemAdjustment = createAdjustmentItem(transactional, invoiceId, invoiceItemId, positiveAdjAmount,
                                                                                currency, effectiveDate);
-                insertItemAndAddCBAIfNeeded(transactional, invoiceItemAdjustment, context);
+                insertItemAndAddCBAIfNeeded(transactional, invoiceItemAdjustment, audits, context);
 
                 notifyBusOfInvoiceAdjustment(transactional, invoiceId, accountId, context.getUserToken());
 
+                // Save audit logs
+                transactional.insertAuditFromTransaction(audits, context);
+
                 return invoiceItemAdjustment;
             }
         });
@@ -678,6 +711,8 @@ public class AuditedInvoiceDao implements InvoiceDao {
         invoiceSqlDao.inTransaction(new Transaction<Void, InvoiceSqlDao>() {
             @Override
             public Void inTransaction(final InvoiceSqlDao transactional, final TransactionStatus status) throws Exception {
+                final List<EntityAudit> audits = new ArrayList<EntityAudit>();
+
                 // Retrieve the invoice and make sure it belongs to the right account
                 final Invoice invoice = transactional.getById(invoiceId.toString());
                 if (invoice == null || !invoice.getAccountId().equals(accountId)) {
@@ -695,6 +730,8 @@ public class AuditedInvoiceDao implements InvoiceDao {
                 final InvoiceItem cbaAdjItem = new CreditBalanceAdjInvoiceItem(invoice.getId(), invoice.getAccountId(), context.getCreatedDate().toLocalDate(),
                                                                                cbaItem.getId(), cbaItem.getAmount().negate(), cbaItem.getCurrency());
                 invoiceItemSqlDao.create(cbaAdjItem, context);
+                final Long cbaAdjItemRecordId = invoiceItemSqlDao.getRecordId(cbaAdjItem.getId().toString());
+                audits.add(new EntityAudit(TableName.INVOICE_ITEMS, cbaAdjItemRecordId, ChangeType.INSERT));
 
                 // Verify the final invoice balance is not negative
                 populateChildren(invoice, transactional);
@@ -752,12 +789,18 @@ public class AuditedInvoiceDao implements InvoiceDao {
                         final InvoiceItem nextCBAAdjItem = new CreditBalanceAdjInvoiceItem(invoiceFollowing.getId(), invoice.getAccountId(), context.getCreatedDate().toLocalDate(),
                                                                                            cbaItem.getId(), positiveCBAAdjItemAmount, cbaItem.getCurrency());
                         invoiceItemSqlDao.create(nextCBAAdjItem, context);
+                        final Long nextCBAAdjItemRecordId = invoiceItemSqlDao.getRecordId(nextCBAAdjItem.getId().toString());
+                        audits.add(new EntityAudit(TableName.INVOICE_ITEMS, nextCBAAdjItemRecordId, ChangeType.INSERT));
+
                         if (positiveRemainderToAdjust.compareTo(BigDecimal.ZERO) == 0) {
                             break;
                         }
                     }
                 }
 
+                // Save audit logs
+                transactional.insertAuditFromTransaction(audits, context);
+
                 return null;
             }
         });
@@ -807,15 +850,18 @@ public class AuditedInvoiceDao implements InvoiceDao {
      *
      * @param transactional the InvoiceSqlDao
      * @param item          the invoice item to create
+     * @param audits        the audits to populate
      * @param context       the call context
      */
-    private Long insertItemAndAddCBAIfNeeded(final InvoiceSqlDao transactional, final InvoiceItem item, final CallContext context) {
+    private void insertItemAndAddCBAIfNeeded(final InvoiceSqlDao transactional, final InvoiceItem item,
+                                             final List<EntityAudit> audits, final CallContext context) {
         final InvoiceItemSqlDao transInvoiceItemDao = transactional.become(InvoiceItemSqlDao.class);
         transInvoiceItemDao.create(item, context);
 
-        addCBAIfNeeded(transactional, item.getInvoiceId(), context);
+        final Long invoiceItemRecordId = transInvoiceItemDao.getRecordId(item.getId().toString());
+        audits.add(new EntityAudit(TableName.INVOICE_ITEMS, invoiceItemRecordId, ChangeType.INSERT));
 
-        return transInvoiceItemDao.getRecordId(item.getId().toString());
+        addCBAIfNeeded(transactional, item.getInvoiceId(), audits, context);
     }
 
     /**
@@ -823,9 +869,11 @@ public class AuditedInvoiceDao implements InvoiceDao {
      *
      * @param transactional the InvoiceSqlDao
      * @param invoiceId     the invoice id to adjust
+     * @param audits        the audits to populate
      * @param context       the call context
      */
-    private void addCBAIfNeeded(final InvoiceSqlDao transactional, final UUID invoiceId, final CallContext context) {
+    private void addCBAIfNeeded(final InvoiceSqlDao transactional, final UUID invoiceId,
+                                final List<EntityAudit> audits, final CallContext context) {
         final Invoice invoice = transactional.getById(invoiceId.toString());
         if (invoice != null) {
             populateChildren(invoice, transactional);
@@ -839,7 +887,8 @@ public class AuditedInvoiceDao implements InvoiceDao {
             final InvoiceItem cbaAdjItem = new CreditBalanceAdjInvoiceItem(invoice.getId(), invoice.getAccountId(), context.getCreatedDate().toLocalDate(),
                                                                            invoice.getBalance().negate(), invoice.getCurrency());
             transInvoiceItemDao.create(cbaAdjItem, context);
-
+            final Long cbaAdjItemRecordId = transInvoiceItemDao.getRecordId(cbaAdjItem.getId().toString());
+            audits.add(new EntityAudit(TableName.INVOICE_ITEMS, cbaAdjItemRecordId, ChangeType.INSERT));
         }
     }