DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`addAccountReconciliation`() BEGIN /** * Updates duplicate records in the accountReconciliation table, * by assigning them a new identifier and then inserts a new entry in the till table. */ UPDATE accountReconciliation ar JOIN ( SELECT id, calculatedCode, CONCAT( calculatedCode, '(', ROW_NUMBER() OVER (PARTITION BY calculatedCode ORDER BY id), ')' ) newId FROM accountReconciliation ar WHERE calculatedCode IN ( SELECT calculatedCode FROM accountReconciliation GROUP BY calculatedCode HAVING COUNT(*) > 1 ) ORDER BY calculatedCode, id ) sub2 ON ar.id = sub2.id SET ar.calculatedCode = sub2.newId; INSERT INTO till( dated, isAccountable, serie, concept, `in`, `out`, bankFk, companyFk, warehouseFk, supplierAccountFk, calculatedCode, InForeignValue, OutForeignValue, workerFk ) SELECT ar.operationDated dated, TRUE isAccountable, 'MB' serie, ar.concept, @totalIn := IF(ar.debitCredit = arc.debitCredit2 AND a.currencyFk = arc.currencyFk, ar.amount, NULL) `in`, @totalOut := IF(ar.debitCredit = arc.debitCredit AND a.currencyFk = arc.currencyFk, ar.amount, NULL) `out`, a.id bankFk, sa.supplierFk companyFk, arc.warehouseFk, ar.supplierAccountFk, ar.calculatedCode, @totalIn InForeignValue, @totalOut OutForeignValue, account.myUser_getId() user FROM accountReconciliation ar JOIN supplierAccount sa ON sa.id = ar.supplierAccountFk JOIN accounting a ON a.id = sa.accountingFk LEFT JOIN till t ON t.calculatedCode = ar.calculatedCode JOIN accountReconciliationConfig arc WHERE t.id IS NULL; END$$ DELIMITER ;