Php 生成贷款收据报告(退款或反向交易)

Php 生成贷款收据报告(退款或反向交易),php,mysql,codeigniter,Php,Mysql,Codeigniter,我正在为一个非政府组织开发一个系统,该系统为穷人提供无息贷款,借款人每月向该组织还款 我的问题是,当员工插入错误值的付款时,反向交易或退款,因此他应该对此交易进行反向操作 我是通过插入此付款的负值来实现的 id ║ loan_id ║ p_amount ║ p_date ║ rev_p_id ║ created_on ║ ═══╬═══════════╬════════════╬═════════════╬═════════════╬═════════════╣ 1

我正在为一个非政府组织开发一个系统,该系统为穷人提供无息贷款,借款人每月向该组织还款 我的问题是,当员工插入错误值的付款时,反向交易或退款,因此他应该对此交易进行反向操作 我是通过插入此付款的负值来实现的

id ║  loan_id  ║ p_amount   ║ p_date      ║ rev_p_id    ║ created_on  ║
═══╬═══════════╬════════════╬═════════════╬═════════════╬═════════════╣
1  ║    1      ║ 500        ║  2011-01-01 ║   null      ║  2011-01-01 ║
═══╬═══════════╬════════════╬═════════════╬═════════════╬═════════════╣
2  ║    1      ║ 500        ║  2011-02-01 ║   null      ║  2011-01-01 ║
═══╬═══════════╬════════════╬═════════════╬═════════════╬═════════════╣
3  ║    1      ║ 500        ║  2011-03-01 ║   null      ║  2011-01-01 ║
═══╬═══════════╬════════════╬═════════════╬═════════════╬═════════════╣
4  ║    1      ║ -500       ║  2011-04-01 ║    2        ║  2011-01-01 
═══╬═══════════╬════════════╬═════════════╬═════════════╬═════════════╣
5  ║    1      ║ 500        ║  2011-05-01 ║   null      ║  2011-01-01 ║
═══╬═══════════╬════════════╬═════════════╬═════════════╬═════════════╣
6  ║    1      ║ 500        ║  2011-06-01 ║   null      ║  2011-01-01 ║
═══╬═══════════╬════════════╬═════════════╬═════════════╬═════════════╣
7  ║    1      ║ 500        ║  2011-07-01 ║   null      ║  2011-01-01 ║
我有贷款,表中有以下列:

id ║   amount  ║ loan_date  ║ created_on  ║ emp_id      ║   client_id ║
═══╬═══════════╬════════════╬═════════════╬═════════════╬═════════════╣
1  ║    10,000 ║ 2011-01-01 ║  2010-01-01 ║    100      ║    600      ║
收入表格

id ║  loan_id  ║ p_amount   ║ p_date      ║ rev_p_id    ║ created_on  ║
═══╬═══════════╬════════════╬═════════════╬═════════════╬═════════════╣
1  ║    1      ║ 500        ║  2011-01-01 ║   null      ║  2011-01-01 ║
═══╬═══════════╬════════════╬═════════════╬═════════════╬═════════════╣
2  ║    1      ║ 500        ║  2011-02-01 ║   null      ║  2011-01-01 ║
═══╬═══════════╬════════════╬═════════════╬═════════════╬═════════════╣
3  ║    1      ║ 500        ║  2011-03-01 ║   null      ║  2011-01-01 ║
═══╬═══════════╬════════════╬═════════════╬═════════════╬═════════════╣
4  ║    1      ║ -500       ║  2011-04-01 ║    2        ║  2011-01-01 
═══╬═══════════╬════════════╬═════════════╬═════════════╬═════════════╣
5  ║    1      ║ 500        ║  2011-05-01 ║   null      ║  2011-01-01 ║
═══╬═══════════╬════════════╬═════════════╬═════════════╬═════════════╣
6  ║    1      ║ 500        ║  2011-06-01 ║   null      ║  2011-01-01 ║
═══╬═══════════╬════════════╬═════════════╬═════════════╬═════════════╣
7  ║    1      ║ 500        ║  2011-07-01 ║   null      ║  2011-01-01 ║
我的问题是,当我想要生成报告时,我使用日期之间的总和查询 案例1 在2011-01-01到2011-06-01之间,我应该给出=2500 这是真的,因为付款编号2和它的反面在日期范围内

案例2 在2011-03-01到2011-06-01之间,我应该给我=1500,并且不求负收入的和,因为它与付款id 2相反,并且不在此期间

我如何确定何时应通过mysql对反向值求和
php我正在使用codeigniter和mysql

我会在您的
收据
表上进行自联接,以获取任何冲销的冲销交易日期,并使用该日期确定冲销是否在报告期内:

id ║  loan_id  ║ p_amount   ║ p_date      ║ rev_p_id    ║ created_on  ║
═══╬═══════════╬════════════╬═════════════╬═════════════╬═════════════╣
1  ║    1      ║ 500        ║  2011-01-01 ║   null      ║  2011-01-01 ║
═══╬═══════════╬════════════╬═════════════╬═════════════╬═════════════╣
2  ║    1      ║ 500        ║  2011-02-01 ║   null      ║  2011-01-01 ║
═══╬═══════════╬════════════╬═════════════╬═════════════╬═════════════╣
3  ║    1      ║ 500        ║  2011-03-01 ║   null      ║  2011-01-01 ║
═══╬═══════════╬════════════╬═════════════╬═════════════╬═════════════╣
4  ║    1      ║ -500       ║  2011-04-01 ║    2        ║  2011-01-01 
═══╬═══════════╬════════════╬═════════════╬═════════════╬═════════════╣
5  ║    1      ║ 500        ║  2011-05-01 ║   null      ║  2011-01-01 ║
═══╬═══════════╬════════════╬═════════════╬═════════════╬═════════════╣
6  ║    1      ║ 500        ║  2011-06-01 ║   null      ║  2011-01-01 ║
═══╬═══════════╬════════════╬═════════════╬═════════════╬═════════════╣
7  ║    1      ║ 500        ║  2011-07-01 ║   null      ║  2011-01-01 ║
select r1.loan_id, sum(r1.p_amount) sum_amount
from receipts r1
left join receipts r2 on r1.rev_p_id=r2.id
where coalesce(r2.p_date,r1.p_date)>=... and coalesce(r2.p_date,r1.p_date)<=...
group by r1.loan_id
选择r1.loan\u id,sum(r1.p\u amount)sum\u amount
从收据r1
r1上的左连接收据r2。rev_p_id=r2.id

其中coalesce(r2.p_日期,r1.p_日期)>=。。。和coalesce(r2.p_日期,r1.p_日期)非常感谢您,我现在将尝试您的解决方案。您的解决方案不适用于我,因为我需要获取所有收据,因为我们使用group By。对不起,但我不明白您的意思。请详细说明。还要记住,你的问题不是要得到所有的收据,而是要得到一个给定时期的金额。