DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`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,
				TRUE,
				'MB',
				ar.concept, 
				IF(ar.debitCredit = 'credit' AND a.currencyFk = arc.currencyFk, ar.amount, NULL),
				IF(ar.debitCredit = 'debit' AND a.currencyFk = arc.currencyFk, ar.amount, NULL),
				a.id,
				sa.supplierFk,
				arc.warehouseFk,
				ar.supplierAccountFk,
				ar.calculatedCode,
				IF(ar.debitCredit = 'credit' AND NOT a.currencyFk = arc.currencyFk, ar.amount, NULL),
				IF(ar.debitCredit = 'debit' AND NOT a.currencyFk = arc.currencyFk, ar.amount, NULL),
				account.myUser_getId()
			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 ;