Thanks Geoff for the idea. I got it working by adding an extra SUM() and 
retrieving invoices instead of customers. Now my virtual field in the 
Invoice model looks like:

'SUM(IF(Invoice.due_date > \''.date('Y-m-d', strtotime('31 days ago')).'\', 
(SELECT IF(SUM(amount) IS NOT NULL, Invoice.total_due - SUM(amount), 
Invoice.total_due) FROM transactions WHERE transactions.invoice_id = 
Invoice.id), 0))'

It's definitely not very clean but it works. 

On Saturday, October 27, 2012 9:57:19 AM UTC-5, Geoff Douglas wrote:
>
> fly2279,
>
> In order to get the aging for the customers, you need to use the data from 
> the invoices model. You need to select the invoices, Cake will join in the 
> customer data because of the belongsTo relationship, then you group on 
> customer, summing up the various fields that you want.
>
> If I where you I would do a join of a sub-select of the total payments, 
> into an invoices select grouped by customer.
>
>
>    - Select Invoices
>       - join Customer (automatically done by cake)
>       - join sub on TotalPayments.invoice_id = Invoice.id
>          - select transactions as TotalPayments
>             - group by invoice
>          - group by customer
>    
> Does this make sense?
>
> Happy Coding.
> Geoff
>
>
>
> On Friday, October 26, 2012 3:05:09 PM UTC-7, fly2279 wrote:
>>
>> I am trying to get an accounts aging report to work correctly. I want to 
>> find all customers that have invoices with a balance within a date range.
>>
>> Invoice hasMany Transaction - the transactions are payments made on that 
>> invoice, I have a virtual field in the Invoice model that takes the total 
>> invoice minus the sum of the transactions that belong to that invoice. The 
>> 'balance_due' virtual field in the Invoice model has this sql 'SELECT 
>> IF(SUM(amount) IS NOT NULL, Invoice.total_due - SUM(amount), 
>> Invoice.total_due) FROM transactions WHERE transactions.invoice_id = 
>> Invoice.id'.
>>
>> In my Customer model that hasMany Invoice I want to retrieve all the 
>> customers and have a virtual field that has the total amount due based on a 
>> date. What I have for my 'aging' virtual field in the Customer model is: 
>> 'SELECT IF(SUM(balance_due) IS NOT NULL, SUM(balance_due), 0) FROM invoices 
>> WHERE invoices.balance_due > 0 AND invoices.due_date > \''.date('Y-m-d', 
>> strtotime('31 days ago')).'\' AND invoices.customer_id = Customer.id'
>>
>> The customer's virtual field would work correctly if it was using a real 
>> column in the invoices table. How do I change the sql string to replace 
>> balance_due with something that will look like the result in the Invoice 
>> model? Do I need some kind of join or subquery?
>>
>

-- 
Like Us on FaceBook https://www.facebook.com/CakePHP
Find us on Twitter http://twitter.com/CakePHP

--- 
You received this message because you are subscribed to the Google Groups 
"CakePHP" group.
To post to this group, send email to cake-php@googlegroups.com.
To unsubscribe from this group, send email to 
cake-php+unsubscr...@googlegroups.com.
Visit this group at http://groups.google.com/group/cake-php?hl=en.


Reply via email to