File: /www/exchange2/sql/archive/2019-11-11-face_value_charge_fix.sql
DROP FUNCTION IF EXISTS `getReserve`;
DELIMITER $$
CREATE FUNCTION `getReserve`(`expected_date` DATE,
`issue_date` DATE,
`payment_date` DATE,
`system_date` DATE,
`reserve` DOUBLE(10, 2),
`face_value` DOUBLE,
`sr` DOUBLE(4, 3),
`pp` DOUBLE(5, 3),
`trade_comission` DOUBLE(7, 4),
`override_180_day_rule` TINYINT(1),
`face_value_charge` DOUBLE(5, 3),
`credebt_facility_type` VARCHAR(20),
`face_value_charge_applied` TINYINT(1),
`ldc_premium` DOUBLE(6, 3),
`agent_commission` DOUBLE(6, 3)) RETURNS decimal(20, 10)
BEGIN
SET
@edso = IFNULL(DATEDIFF(DATE(expected_date), DATE(issue_date)), 0),
@rdso =
DATEDIFF(IF(reserve IS NOT NULL AND payment_date <= system_date, payment_date, system_date),
DATE(issue_date)),
@adso = IF(@edso > @rdso, @edso, @rdso),
@sr = sr * 100 / (100 - agent_commission),
@face_value_charge = face_value_charge * 100 / (100 - agent_commission);
IF (reserve IS NOT NULL AND (system_date = CURDATE() OR system_date >= payment_date)) THEN
RETURN reserve;
ELSEIF (`face_value_charge_applied` = 1) THEN
RETURN face_value - face_value * pp / 100 - face_value * @face_value_charge / 100 -
face_value * ldc_premium / 100 - trade_comission;
ELSEIF (@adso >= 180 AND override_180_day_rule = 0) THEN
RETURN face_value * @sr / 100 * 12 * (180 - @adso) / 360 - face_value * ldc_premium / 100 - trade_comission;
ELSE
RETURN face_value - face_value * @sr / 100 * 12 * 180 / 360 - face_value * pp / 100 +
face_value * @sr / 100 * 12 * (180 - @adso) / 360 - face_value * ldc_premium / 100 - trade_comission;
END IF;
END$$
DELIMITER ;
UPDATE invoice_master im
JOIN debtors_detail dd on im.debtor_id = dd.debtor_id
JOIN organisation_details od on im.user_id = od.user_id
SET im.face_value_charge = IF(im.manual_transaction_id > 0, IFNULL(im.face_value_charge, 0),
IFNULL(im.face_value_charge, IFNULL(dd.face_value_charge, IF(dd.type = 'debtor',
IF(od.credebt_facility_type = 'fixed', od.face_value_charge, 0),
od.creditor_face_value_charge)))),
im.face_value_charge_applied = IF(im.manual_transaction_id > 0 AND dd.type = 'debtor', im.face_value_charge_applied,
IF((dd.type = 'debtor' AND od.credebt_facility_type = 'fixed') OR
(dd.type = 'creditor' AND IFNULL(im.face_value_charge,
IFNULL(dd.face_value_charge, od.creditor_face_value_charge)) >
0), 1, 0))
WHERE im.root_invoice_id > 0;