Rateio - Lista de Produtos

Olá pessoal, situação…
Tenho os produtos atrelado a pedidos, a questão que preciso ratear o frete por update entre os produtos daquele pedido:

Atual
Pedido 252
Total Frete: 5,00
Calça - 0,00
Camisa - 0,00
Chinelo - 0,00

Objetivo
Pedido 252
Total Frete: 5,00
Calça - 1,66
Camisa - 1,66
Chinelo - 1,68*
*O último pela diferença do valor…

Rateamento deve ser proporcional ao peso total do item do pedido calculando quantidade x peso e somando todos os itens para calcula o percentual de participação no total de cada item. Aplica se esse percentual no total do frete e no último item soma o residual.

O problema está sendo como fazer esta aplicação… agora de manhã bateu na cabeça o uso de vetor pra distribuir este valor… tô me batendo aqui pra conseguir, sou lento mesmo… se não der agradeço as colaborações, e estou aberto a sugestões…rs

Uma stored procedure fazendo numa tacada só minha sugestão.
Pode ser em trigger ao inserir e alterar cada item mas aí, antes do inserir os itens obrigatoriamente o frete deve ser informado, o que na prática raramente acontece, pois o frete varia conforme o peso do pedido.

Segue uma sugestão de código (não testado,pois escrevi aqui diretamente):

CREATE DEFINER=`root`@`%` PROCEDURE `sp_RecalcPedido`(
	IN `parPedidoId` INT
)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY INVOKER

BEGIN
  DECLARE varFreteTotal decimal(10,2);
  DECLARE varPesoTotal  decimal(10,3);
  DECLARE varFreteItens  decimal(10,3);
  
  /* Frete Total */
  Select frete into varFreteTotal from pedido where id = parPedidoId;
  
  /* Peso Total dos Itens (ideal já estar gravado no pedido) */
  Select sum(quantidade*peso_unitario) into varpesoTotal from itens i inner join produtos p on i.produtoId = p.id where i.pedidoId = parPedidoId;
  
  /* Rateando Frete nos itens (ideal é ter o peso_total do item ja gravado no item, oui o peso unitario do produto) */
  Update itens i INNER JOIN produto p on i.produtoId=p.id 
  set frete =( i.quantidade*p.peso_unitario / varpesoTotal * varFreteTotal) where i.pedidoId = parPedidoId;
  
  /* aplicando residual */
  
  Select sum(frete) into varFreteItens from itens where pedidoid = parPedidoId;
  
  Update itens set frete = frete + (varFreteTotal - varFreteItens) where pedidoId = parPedidoId order by id desc limit 1;
  
  
END

Aqui um exemplo em php de rateio de parcelas com residual (aritmética simples) em php que pode ser adaptado para calcular com proporção ao peso do item:

Mas norteia o caminho das pedras.

1 Curtida

Rapaz, o bolo, refrigerante e os adereços montados, só falta cantar parabéns…rsrs::rofl::rofl::rofl:
Muito obrigado, vou trabalhar em cima!!!