SET DEFINE OFF;

INSERT INTO SICESTS (cest, descricao, ativo, capituloCest, observacoes) values ('2108801','Microventiladores com área de carcaça inferior a 90 cm2','1','21',' ');
INSERT INTO SICESTS (cest, descricao, ativo, capituloCest, observacoes) values ('2503000','Outros veículos para transportes de mercadorias equipados para propulsão, simultaneamente, com motor de pistão de ignição por compressão (diesel ou semidiesel) e motor elétrico de peso em carga máxima (bruto) não superior a 5 toneladas, exceto caminhão...','1','25','Outros veículos para transportes de mercadorias equipados para propulsão, simultaneamente, com motor de pistão de ignição por compressão (diesel ou semidiesel) e motor elétrico de peso em carga máxima (bruto) não superior a 5 toneladas, exceto caminhão de peso em carga máxima superior a 3,9 toneladas');
INSERT INTO SICESTS (cest, descricao, ativo, capituloCest, observacoes) values ('2503100','Outros veículos para transportes de mercadorias equipados para propulsão, simultaneamente, com motor de pistão de ignição por centelha (faísca) e motor elétrico de peso em carga máxima (bruto) não superior a 5 toneladas, exceto caminhão de peso em carga...','1','25','Outros veículos para transportes de mercadorias equipados para propulsão, simultaneamente, com motor de pistão de ignição por centelha (faísca) e motor elétrico de peso em carga máxima (bruto) não superior a 5 toneladas, exceto caminhão de peso em carga máxima superior a 3,9 toneladas');
INSERT INTO SICESTS (cest, descricao, ativo, capituloCest, observacoes) values ('2600101','Bicicletas e outros ciclos (incluídos os triciclos) com propulsão de motor elétrico auxiliar assistido pela força humana.','1','26',' ');

COMMIT;

UPDATE SINCMS SET ativo = 0 WHERE idNcm IN (39239000000, 94032000000);

INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (39239010000, '39239010','   ', 'Artigos de transporte ou de embalagem, de plástico; rolhas, tampas, cápsulas e outros dispositivos para fechar recipientes, de plástico. - Outros - Paletes simples, paletes-caixas e outros estrados para carga; taipais de paletes', 1, '392390', 2806400, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (39239090000, '39239090','   ', 'Artigos de transporte ou de embalagem, de plástico; rolhas, tampas, cápsulas e outros dispositivos para fechar recipientes, de plástico. - Outros - Outros', 1, '392390', 2806400, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (90183925000, '90183925','   ', 'Instrumentos e aparelhos para medicina, cirurgia, odontologia e veterinária, incluindo os aparelhos para cintilografia e outros aparelhos eletromédicos, bem como os aparelhos para testes visuais. - Seringas, agulhas, cateteres, cânulas e instrumentos se...', 1, '9018392', 2805800, 'Instrumentos e aparelhos para medicina, cirurgia, odontologia e veterinária, incluindo os aparelhos para cintilografia e outros aparelhos eletromédicos, bem como os aparelhos para testes visuais. - Seringas, agulhas, cateteres, cânulas e instrumentos semelhantes: -- Outros Sondas vesicais estéreis de poliuretano, com revestimento hidrofílico, de uso intermitente, apresentadas em embalagens com solução salina');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (94032010000, '94032010','   ', 'Outros móveis e suas partes. - Outros móveis de metal - Outros móveis de metal - Do tipo utilizado em cozinhas', 1, '940320', 2806100, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (94032090000, '94032090','   ', 'Outros móveis e suas partes. - Outros móveis de metal - Outros móveis de metal - Outros', 1, '940320', 2806100, ' ');

COMMIT;

CREATE TABLE SIDECRETO_56559_2022
  (
    id                  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idNcm               NUMERIC (11,0) DEFAULT 0 NOT NULL,
    cest                NUMERIC (7,0) DEFAULT 0 NOT NULL,
    aliquotaInternaICMS NUMERIC (7,4) DEFAULT 0 NOT NULL,
    mvaInterno          NUMERIC (7,4) DEFAULT 0 NOT NULL,
    mvaOrigem12         NUMERIC (7,4) DEFAULT 0 NOT NULL,
    mvaOrigem4          NUMERIC (7,4) DEFAULT 0 NOT NULL
  );
ALTER TABLE SIDECRETO_56559_2022 ADD CONSTRAINT SIDECRETO_56559_2022_PK1 PRIMARY KEY (id);
CREATE INDEX SIDECRETO_56559_2022_K2 ON SIDECRETO_56559_2022 (idNcm, cest, aliquotaInternaICMS);
ALTER TABLE SIDECRETO_56559_2022 ADD CONSTRAINT SIDECRETO_56559_2022_FK1 FOREIGN KEY (idNcm) REFERENCES SINCMS (idNcm);
ALTER TABLE SIDECRETO_56559_2022 ADD CONSTRAINT SIDECRETO_56559_2022_FK2 FOREIGN KEY (cest) REFERENCES SICESTS (cest);

INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (0, 0, 0, 0, 0, 0, 0);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (1, 15100000000, 1706800, 17, 140.75, 155.25, 178.45);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (2, 15101000000, 1706800, 17, 140.75, 155.25, 178.45);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (3, 15109000000, 1706800, 17, 140.75, 155.25, 178.45);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (4, 28289011000, 1100100, 17, 55.66, 65.03, 80.04);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (5, 28289019000, 1100100, 17, 55.66, 65.03, 80.04);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (6, 32041700000, 2400200, 17, 118.00, 131.13, 152.14);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (7, 32061110000, 2400200, 17, 118.00, 131.13, 152.14);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (8, 32064100000, 1100100, 17, 55.66, 65.03, 80.04);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (9, 34025000000, 1100100, 17, 55.66, 65.03, 80.04);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (10, 38089419000, 1100100, 17, 55.66, 65.03, 80.04);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (11, 38089419001, 1100100, 17, 55.66, 65.03, 80.04);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (12, 38089419002, 1100100, 17, 55.66, 65.03, 80.04);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (13, 39191000000, 0109000, 17, 0, 0, 0);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (14, 39191010000, 0109000, 17, 0, 0, 0);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (15, 39191020000, 0109000, 17, 0, 0, 0);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (16, 39191090000, 0109000, 17, 0, 0, 0);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (17, 39199000000, 0109000, 17, 0, 0, 0);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (18, 39199010000, 0109000, 17, 0, 0, 0);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (19, 39199020000, 0109000, 17, 0, 0, 0);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (20, 39199090000, 0109000, 17, 0, 0, 0);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (21, 57032900000, 0110500, 17, 0, 0, 0);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (22, 73181100000, 1005800, 17, 69.00, 79.18, 95.46);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (23, 73181200000, 1005800, 17, 69.00, 79.18, 95.46);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (24, 73181300000, 1005800, 17, 69.00, 79.18, 95.46);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (25, 73181400000, 1005800, 17, 69.00, 79.18, 95.46);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (26, 73181500000, 1005800, 17, 69.00, 79.18, 95.46);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (27, 73181600000, 1005800, 17, 69.00, 79.18, 95.46);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (28, 73181900000, 1005800, 17, 69.00, 79.18, 95.46);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (29, 73182100000, 1005800, 17, 69.00, 79.18, 95.46);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (30, 73182200000, 1005800, 17, 69.00, 79.18, 95.46);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (31, 73182300000, 1005800, 17, 69.00, 79.18, 95.46);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (32, 73182400000, 1005800, 17, 69.00, 79.18, 95.46);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (33, 73182900000, 1005800, 17, 69.00, 79.18, 95.46);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (34, 84213200000, 0104200, 17, 0, 0, 0);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (35, 85171300000, 2105301, 17, 38.00, 46.31, 59.61);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (36, 85171410000, 0105600, 17, 0, 0, 0);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (37, 85171431000, 2105301, 17, 38.00, 46.31, 59.61);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (38, 85171432000, 2105300, 17, 38.00, 46.31, 59.61);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (39, 85171439000, 2105300, 17, 38.00, 46.31, 59.61);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (40, 85171441000, 2105400, 17, 38.00, 46.31, 59.61);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (41, 85171449000, 2105400, 17, 38.00, 46.31, 59.61);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (42, 85171490000, 2105400, 17, 38.00, 46.31, 59.61);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (43, 85171830000, 2105500, 17, 50.00, 59.03, 73.49);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (44, 85171890000, 2105501, 17, 50.00, 59.03, 73.49);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (45, 85176229000, 2108100, 17, 78.00, 88.72, 105.87);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (46, 85176262000, 2108400, 17, 99.00, 110.98, 130.16);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (47, 85177110000, 2108600, 17, 112.00, 124.77, 145.20);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (48, 85235200000, 2106300, 17, 78.00, 88.72, 105.87);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (49, 85235210000, 2106300, 17, 78.00, 88.72, 105.87);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (50, 85235290000, 2106300, 17, 78.00, 88.72, 105.87);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (51, 85258921000, 2106500, 17, 60.00, 69.63, 85.06);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (52, 85258922000, 2106500, 17, 60.00, 69.63, 85.06);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (53, 85258929000, 2106500, 17, 60.00, 69.63, 85.06);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (54, 85284990000, 2106700, 17, 31.00, 38.89, 51.51);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (55, 85285200000, 2106800, 17, 23.00, 0, 0);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (56, 85285900000, 2106700, 17, 31.00, 38.89, 51.51);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (57, 85286910000, 2106700, 17, 31.00, 38.89, 51.51);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (58, 85286990000, 2106700, 17, 31.00, 38.89, 51.51);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (59, 85291011000, 0106300, 17, 0, 0, 0);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (60, 85291019000, 0106300, 17, 0, 0, 0);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (61, 85291020000, 0106300, 17, 0, 0, 0);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (62, 85291090000, 0106300, 17, 0, 0, 0);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (63, 85365010000, 0900400, 17, 102.31, 114.49, 133.99);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (64, 85365020000, 0900400, 17, 102.31, 114.49, 133.99);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (65, 85365030000, 0900400, 17, 102.31, 114.49, 133.99);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (66, 85365090000, 0900400, 17, 102.31, 114.49, 133.99);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (67, 85365090001, 0900400, 17, 102.31, 114.49, 133.99);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (68, 85365090002, 0900400, 17, 102.31, 114.49, 133.99);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (69, 85365090003, 0900400, 17, 102.31, 114.49, 133.99);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (70, 85391010000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (71, 85391090000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (72, 85392110000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (73, 85392110001, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (74, 85392190000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (75, 85392190001, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (76, 85392200000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (77, 85392200001, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (78, 85392910000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (79, 85392910001, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (80, 85392990000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (81, 85392990001, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (82, 85392990002, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (83, 85393100000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (84, 85393100001, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (85, 85393111000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (86, 85393119000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (87, 85393120000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (88, 85393131000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (89, 85393132000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (90, 85393139000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (91, 85393200000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (92, 85393200001, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (93, 85393210000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (94, 85393220000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (95, 85393230000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (96, 85393900000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (97, 85393900001, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (98, 85393911000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (99, 85393912000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (100, 85393913000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (101, 85393919000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (102, 85393990000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (103, 85394110000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (104, 85394190000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (105, 85394900000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (106, 85395000000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (107, 85395100000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (108, 85395200000, 0900500, 17, 63.67, 73.52, 85.09);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (109, 85399010000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (110, 85399020000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (111, 85399090000, 0900100, 17, 60.03, 69.67, 89.30);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (112, 85401100000, 0900200, 17, 102.31, 114.49, 133.99);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (113, 85401200000, 0900200, 17, 102.31, 114.49, 133.99);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (114, 85402011000, 0900200, 17, 102.31, 114.49, 133.99);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (115, 85402019000, 0900200, 17, 102.31, 114.49, 133.99);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (116, 85402020000, 0900200, 17, 102.31, 114.49, 133.99);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (117, 85402090000, 0900200, 17, 102.31, 114.49, 133.99);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (118, 85404000000, 0900200, 17, 102.31, 114.49, 133.99);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (119, 85406010000, 0900200, 17, 102.31, 114.49, 133.99);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (120, 85406090000, 0900200, 17, 102.31, 114.49, 133.99);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (121, 85407100000, 0900200, 17, 102.31, 114.49, 133.99);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (122, 85407900000, 0900200, 17, 102.31, 114.49, 133.99);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (123, 85408100000, 0900200, 17, 102.31, 114.49, 133.99);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (124, 85408910000, 0900200, 17, 102.31, 114.49, 133.99);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (125, 85408990000, 0900200, 17, 102.31, 114.49, 133.99);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (126, 85409110000, 0900200, 17, 102.31, 114.49, 133.99);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (127, 85409120000, 0900200, 17, 102.31, 114.49, 133.99);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (128, 85409130000, 0900200, 17, 102.31, 114.49, 133.99);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (129, 85409140000, 0900200, 17, 102.31, 114.49, 133.99);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (130, 85409190000, 0900200, 17, 102.31, 114.49, 133.99);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (131, 85409900000, 0900200, 17, 102.31, 114.49, 133.99);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (132, 85414111000, 2111700, 17, 83.00, 94.02, 111.66);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (133, 85414121000, 2111700, 17, 83.00, 94.02, 111.66);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (134, 85414122000, 2111700, 17, 83.00, 94.02, 111.66);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (135, 87044100000, 2503000, 17, 30.00, 30.00, 41.81);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (136, 87045100000, 2503100, 17, 30.00, 30.00, 41.81);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (137, 87082999000, 0109000, 17, 0, 0, 0);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (138, 94019900000, 0108500, 17, 0, 0, 0);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (139, 94051010000, 2112300, 17, 47.00, 55.85, 70.02);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (140, 94051091000, 2112300, 17, 47.00, 55.85, 70.02);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (141, 94051092000, 2112300, 17, 47.00, 55.85, 70.02);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (142, 94051093000, 2112300, 17, 47.00, 55.85, 70.02);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (143, 94051099000, 2112300, 17, 47.00, 55.85, 70.02);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (144, 94051110000, 2112300, 17, 47.00, 55.85, 70.02);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (145, 94051190000, 2112300, 17, 47.00, 55.85, 70.02);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (146, 94051910000, 2112300, 17, 47.00, 55.85, 70.02);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (147, 94051990000, 2112300, 17, 47.00, 55.85, 70.02);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (148, 94052000000, 2112400, 17, 47.00, 55.85, 70.02);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (149, 94052100000, 2112400, 17, 47.00, 55.85, 70.02);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (150, 94052900000, 2112400, 17, 47.00, 55.85, 70.02);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (151, 94054010000, 2112500, 17, 55.00, 64.33, 79.27);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (152, 94054090000, 2112500, 17, 55.00, 64.33, 79.27);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (153, 94054090001, 2112500, 17, 55.00, 64.33, 79.27);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (154, 94054100000, 2112500, 17, 55.00, 64.33, 79.27);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (155, 94054200000, 2112500, 17, 55.00, 64.33, 79.27);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (156, 94054900000, 2112500, 17, 55.00, 64.33, 79.27);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (157, 94059100000, 2112300, 17, 47.00, 55.85, 70.02);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (158, 94059200000, 2112300, 17, 47.00, 55.85, 70.02);
INSERT INTO SIDECRETO_56559_2022 (id, idNcm, cest, aliquotaInternaICMS, mvaInterno, mvaOrigem12, mvaOrigem4) VALUES (159, 94059900000, 2112300, 17, 47.00, 55.85, 70.02);

COMMIT;

UPDATE SINCMS SET cest = 1706800 WHERE idNcm = 15100000000;
UPDATE SINCMS SET cest = 1706800 WHERE idNcm = 15101000000;
UPDATE SINCMS SET cest = 1706800 WHERE idNcm = 15109000000;
UPDATE SINCMS SET cest = 1100100 WHERE idNcm = 28289011000;
UPDATE SINCMS SET cest = 1100100 WHERE idNcm = 28289019000;
UPDATE SINCMS SET cest = 2400200 WHERE idNcm = 32041700000;
UPDATE SINCMS SET cest = 2400200 WHERE idNcm = 32061110000;
UPDATE SINCMS SET cest = 1100100 WHERE idNcm = 32064100000;
UPDATE SINCMS SET cest = 1100100 WHERE idNcm = 34025000000;
UPDATE SINCMS SET cest = 1100100 WHERE idNcm = 38089419000;
UPDATE SINCMS SET cest = 1100100 WHERE idNcm = 38089419001;
UPDATE SINCMS SET cest = 1100100 WHERE idNcm = 38089419002;
UPDATE SINCMS SET cest = 0109000 WHERE idNcm = 39191000000;
UPDATE SINCMS SET cest = 0109000 WHERE idNcm = 39191010000;
UPDATE SINCMS SET cest = 0109000 WHERE idNcm = 39191020000;
UPDATE SINCMS SET cest = 0109000 WHERE idNcm = 39191090000;
UPDATE SINCMS SET cest = 0109000 WHERE idNcm = 39199000000;
UPDATE SINCMS SET cest = 0109000 WHERE idNcm = 39199010000;
UPDATE SINCMS SET cest = 0109000 WHERE idNcm = 39199020000;
UPDATE SINCMS SET cest = 0109000 WHERE idNcm = 39199090000;
UPDATE SINCMS SET cest = 0110500 WHERE idNcm = 57032900000;
UPDATE SINCMS SET cest = 1005800 WHERE idNcm = 73181100000;
UPDATE SINCMS SET cest = 1005800 WHERE idNcm = 73181200000;
UPDATE SINCMS SET cest = 1005800 WHERE idNcm = 73181300000;
UPDATE SINCMS SET cest = 1005800 WHERE idNcm = 73181400000;
UPDATE SINCMS SET cest = 1005800 WHERE idNcm = 73181500000;
UPDATE SINCMS SET cest = 1005800 WHERE idNcm = 73181600000;
UPDATE SINCMS SET cest = 1005800 WHERE idNcm = 73181900000;
UPDATE SINCMS SET cest = 1005800 WHERE idNcm = 73182100000;
UPDATE SINCMS SET cest = 1005800 WHERE idNcm = 73182200000;
UPDATE SINCMS SET cest = 1005800 WHERE idNcm = 73182300000;
UPDATE SINCMS SET cest = 1005800 WHERE idNcm = 73182400000;
UPDATE SINCMS SET cest = 1005800 WHERE idNcm = 73182900000;
UPDATE SINCMS SET cest = 0104200 WHERE idNcm = 84213200000;
UPDATE SINCMS SET cest = 2105301 WHERE idNcm = 85171300000;
UPDATE SINCMS SET cest = 0105600 WHERE idNcm = 85171410000;
UPDATE SINCMS SET cest = 2105301 WHERE idNcm = 85171431000;
UPDATE SINCMS SET cest = 2105300 WHERE idNcm = 85171432000;
UPDATE SINCMS SET cest = 2105300 WHERE idNcm = 85171439000;
UPDATE SINCMS SET cest = 2105400 WHERE idNcm = 85171441000;
UPDATE SINCMS SET cest = 2105400 WHERE idNcm = 85171449000;
UPDATE SINCMS SET cest = 2105400 WHERE idNcm = 85171490000;
UPDATE SINCMS SET cest = 2105500 WHERE idNcm = 85171830000;
UPDATE SINCMS SET cest = 2105501 WHERE idNcm = 85171890000;
UPDATE SINCMS SET cest = 2108100 WHERE idNcm = 85176229000;
UPDATE SINCMS SET cest = 2108400 WHERE idNcm = 85176262000;
UPDATE SINCMS SET cest = 2108600 WHERE idNcm = 85177110000;
UPDATE SINCMS SET cest = 2106300 WHERE idNcm = 85235200000;
UPDATE SINCMS SET cest = 2106300 WHERE idNcm = 85235210000;
UPDATE SINCMS SET cest = 2106300 WHERE idNcm = 85235290000;
UPDATE SINCMS SET cest = 2106500 WHERE idNcm = 85258921000;
UPDATE SINCMS SET cest = 2106500 WHERE idNcm = 85258922000;
UPDATE SINCMS SET cest = 2106500 WHERE idNcm = 85258929000;
UPDATE SINCMS SET cest = 2106700 WHERE idNcm = 85284990000;
UPDATE SINCMS SET cest = 2106800 WHERE idNcm = 85285200000;
UPDATE SINCMS SET cest = 2106700 WHERE idNcm = 85285900000;
UPDATE SINCMS SET cest = 2106700 WHERE idNcm = 85286910000;
UPDATE SINCMS SET cest = 2106700 WHERE idNcm = 85286990000;
UPDATE SINCMS SET cest = 0106300 WHERE idNcm = 85291011000;
UPDATE SINCMS SET cest = 0106300 WHERE idNcm = 85291019000;
UPDATE SINCMS SET cest = 0106300 WHERE idNcm = 85291020000;
UPDATE SINCMS SET cest = 0106300 WHERE idNcm = 85291090000;
UPDATE SINCMS SET cest = 0900400 WHERE idNcm = 85365010000;
UPDATE SINCMS SET cest = 0900400 WHERE idNcm = 85365020000;
UPDATE SINCMS SET cest = 0900400 WHERE idNcm = 85365030000;
UPDATE SINCMS SET cest = 0900400 WHERE idNcm = 85365090000;
UPDATE SINCMS SET cest = 0900400 WHERE idNcm = 85365090001;
UPDATE SINCMS SET cest = 0900400 WHERE idNcm = 85365090002;
UPDATE SINCMS SET cest = 0900400 WHERE idNcm = 85365090003;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85391010000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85391090000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85392110000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85392110001;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85392190000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85392190001;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85392200000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85392200001;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85392910000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85392910001;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85392990000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85392990001;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85392990002;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85393100000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85393100001;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85393111000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85393119000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85393120000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85393131000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85393132000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85393139000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85393200000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85393200001;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85393210000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85393220000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85393230000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85393900000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85393900001;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85393911000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85393912000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85393913000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85393919000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85393990000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85394110000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85394190000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85394900000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85395000000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85395100000;
UPDATE SINCMS SET cest = 0900500 WHERE idNcm = 85395200000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85399010000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85399020000;
UPDATE SINCMS SET cest = 0900100 WHERE idNcm = 85399090000;
UPDATE SINCMS SET cest = 0900200 WHERE idNcm = 85401100000;
UPDATE SINCMS SET cest = 0900200 WHERE idNcm = 85401200000;
UPDATE SINCMS SET cest = 0900200 WHERE idNcm = 85402011000;
UPDATE SINCMS SET cest = 0900200 WHERE idNcm = 85402019000;
UPDATE SINCMS SET cest = 0900200 WHERE idNcm = 85402020000;
UPDATE SINCMS SET cest = 0900200 WHERE idNcm = 85402090000;
UPDATE SINCMS SET cest = 0900200 WHERE idNcm = 85404000000;
UPDATE SINCMS SET cest = 0900200 WHERE idNcm = 85406010000;
UPDATE SINCMS SET cest = 0900200 WHERE idNcm = 85406090000;
UPDATE SINCMS SET cest = 0900200 WHERE idNcm = 85407100000;
UPDATE SINCMS SET cest = 0900200 WHERE idNcm = 85407900000;
UPDATE SINCMS SET cest = 0900200 WHERE idNcm = 85408100000;
UPDATE SINCMS SET cest = 0900200 WHERE idNcm = 85408910000;
UPDATE SINCMS SET cest = 0900200 WHERE idNcm = 85408990000;
UPDATE SINCMS SET cest = 0900200 WHERE idNcm = 85409110000;
UPDATE SINCMS SET cest = 0900200 WHERE idNcm = 85409120000;
UPDATE SINCMS SET cest = 0900200 WHERE idNcm = 85409130000;
UPDATE SINCMS SET cest = 0900200 WHERE idNcm = 85409140000;
UPDATE SINCMS SET cest = 0900200 WHERE idNcm = 85409190000;
UPDATE SINCMS SET cest = 0900200 WHERE idNcm = 85409900000;
UPDATE SINCMS SET cest = 2111700 WHERE idNcm = 85414111000;
UPDATE SINCMS SET cest = 2111700 WHERE idNcm = 85414121000;
UPDATE SINCMS SET cest = 2111700 WHERE idNcm = 85414122000;
UPDATE SINCMS SET cest = 2503000 WHERE idNcm = 87044100000;
UPDATE SINCMS SET cest = 2503100 WHERE idNcm = 87045100000;
UPDATE SINCMS SET cest = 0109000 WHERE idNcm = 87082999000;
UPDATE SINCMS SET cest = 0108500 WHERE idNcm = 94019900000;
UPDATE SINCMS SET cest = 2112300 WHERE idNcm = 94051010000;
UPDATE SINCMS SET cest = 2112300 WHERE idNcm = 94051091000;
UPDATE SINCMS SET cest = 2112300 WHERE idNcm = 94051092000;
UPDATE SINCMS SET cest = 2112300 WHERE idNcm = 94051093000;
UPDATE SINCMS SET cest = 2112300 WHERE idNcm = 94051099000;
UPDATE SINCMS SET cest = 2112300 WHERE idNcm = 94051110000;
UPDATE SINCMS SET cest = 2112300 WHERE idNcm = 94051190000;
UPDATE SINCMS SET cest = 2112300 WHERE idNcm = 94051910000;
UPDATE SINCMS SET cest = 2112300 WHERE idNcm = 94051990000;
UPDATE SINCMS SET cest = 2112400 WHERE idNcm = 94052000000;
UPDATE SINCMS SET cest = 2112400 WHERE idNcm = 94052100000;
UPDATE SINCMS SET cest = 2112400 WHERE idNcm = 94052900000;
UPDATE SINCMS SET cest = 2112500 WHERE idNcm = 94054010000;
UPDATE SINCMS SET cest = 2112500 WHERE idNcm = 94054090000;
UPDATE SINCMS SET cest = 2112500 WHERE idNcm = 94054090001;
UPDATE SINCMS SET cest = 2112500 WHERE idNcm = 94054100000;
UPDATE SINCMS SET cest = 2112500 WHERE idNcm = 94054200000;
UPDATE SINCMS SET cest = 2112500 WHERE idNcm = 94054900000;
UPDATE SINCMS SET cest = 2112300 WHERE idNcm = 94059100000;
UPDATE SINCMS SET cest = 2112300 WHERE idNcm = 94059200000;
UPDATE SINCMS SET cest = 2112300 WHERE idNcm = 94059900000;

COMMIT;

-- RODAR SOMENTE NO DIA 30/09/2022
/*
DECLARE
  v_filtroProduto NUMBER;
BEGIN
  v_filtroProduto := FUNC_ADD_BUSCA_PROXIMO_ID('PAFILTROSPRODUTO', 'filtroProduto', 0, 1, NULL);
  INSERT INTO PAFILTROSPRODUTO (filtroProduto, descricao, ativo, quantidadeMinima, quantidadeMaxima, filtrarVendedores, filtrarLocaisEstoque, filtrarProdutos, filtrarCategoriasProdutos, filtrarSubcategoriasProdutos, filtrarMarcas, filtrarCaracteristicasA, filtrarCaracteristicasB, filtrarCaracteristicasC, filtrarCaracteristicasD, filtrarCaracteristicasE, filtrarCores, filtrarTamanhos, filtrarPersonalizacoes, filtrarNCMs, filtrarListasServicos, observacoes) VALUES (v_filtroProduto, 'PRODUTOS DECRETO 56559/2022', 1, 0, 999999999.999999, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ');
  INSERT INTO PAFILTROPRODUTOXPRODUTOS (id, filtroProduto, produto, ativo) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('PAFILTROPRODUTOXPRODUTOS', 'id', 0, 1, NULL), v_filtroProduto, prod.produto, 1 FROM CAPRODUTOS prod WHERE prod.produto <> 0 AND prod.idNcm <> 0 AND EXISTS (SELECT 1 FROM SIDECRETO_56559_2022 dec WHERE dec.idNcm = prod.idNcm);
  COMMIT;
END;

/
*/

INSERT INTO SICONFIGURACOES (configuracao, descricao, ativo, subcategoriaConfiguracao, tipoCampo, mascara, exibirCampo, tipoArquivo, conteudoSugestao, tabelaSistema, observacoes) values (395, 'Permitir resgate de pontos sem biometria', 1, 30001, 'A', '1', 'S', 0, 'S', ' ', 'Caso o usuário não tenha permissão de resgatar pontos sem biometria, será solicitada a biometria do cliente. Caso não seja informada a biometria, será aberta tela solicitando senha para liberação.');

COMMIT;

create or replace PROCEDURE ADD_DOC_FISC_CALC_IMP_RATEIO (
    p_cab_idDocumentoFiscal        IN NUMBER,
    p_troca_tipoPagamentoFrete     IN NUMBER,
    p_a_cab_tipoPagamentoFrete     IN CHAR,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_nfFornecedor             IN NUMBER,
    p_cab_tipoPagamentoFrete       IN CHAR,
    p_cab_valorFreteGeral          IN NUMBER,
    p_cab_valorSeguroGeral         IN NUMBER,
    p_cab_valorDescontoGeral       IN NUMBER,
    p_cab_valorOutrasDespesasGeral IN NUMBER,
    p_cab_valorAdicFreteMarinGeral IN NUMBER,
    p_cab_valorDespesasAduanGeral  IN NUMBER,
    p_cab_valorDescontoPagamento   IN NUMBER,
    p_cab_valorOutrasDespPagamento IN NUMBER,
    p_cab_valorJurosPagamento      IN NUMBER,
    p_cab_impostosEditados         IN NUMBER,
    p_cab_valorDescCustoOpGeral    IN NUMBER,
    p_cab_valorAcrescCustoOpGeral  IN NUMBER,
    p_cab_valorAcrescExtempGeral   IN NUMBER,
    p_modDoc_diminuiDescontoPrUnit IN NUMBER,
    p_modDoc_somaAcrescimosPrUnit  IN NUMBER,
    p_modDoc_somaFreteSeguroPrUnit IN NUMBER,
    p_modDoc_habilitaControleEntr  IN NUMBER,
    /* Retornos */
    r_cab_valorProdutos            OUT NUMBER,
    r_cab_valorServicos            OUT NUMBER,
    r_cab_valorBasePagamento       OUT NUMBER,
    r_cab_valorAVistaMinimo        OUT NUMBER,
    r_cab_valorFreteTotal          OUT NUMBER,
    r_cab_valorSeguroTotal         OUT NUMBER,
    r_cab_valorDescontoTotal       OUT NUMBER,
    r_cab_valorOutrasDespesasTotal OUT NUMBER,
    r_cab_valorAdicFreteMarinTotal OUT NUMBER,
    r_cab_valorDespesasAduanTotal  OUT NUMBER,
    r_cab_valorImpSomaPagamento    OUT NUMBER,
    r_cab_valorImpDiminuiPagamento OUT NUMBER,
    r_cab_valorLiquidoItem         OUT NUMBER,
    r_cab_valorDescCustoOpTotal    OUT NUMBER,
    r_cab_valorAcrescCustoOpTotal  OUT NUMBER,
    r_cab_valorCustoOperacao       OUT NUMBER,
    r_cab_valorCMV                 OUT NUMBER,
    r_cab_valorAcrescExtempTotal   OUT NUMBER,
    r_calcularImpostosItem         OUT NUMBER)
IS
    v_auxNumber                    NUMBER;
    v_valorDescontoPromocaoGeral   NUMBER;
    v_valorDescontoPromocaoPagamen NUMBER;
    v_rateioDescontofiltrarSemProm NUMBER;
    v_rateioDescontofiltrarAPrazo  NUMBER;
    v_rateioFretePorControleEntr   NUMBER;
    v_valorBaseRateio              NUMBER;
    v_valorBaseRateioFrete         NUMBER;
    v_valorBaseRateioFinanceiro    NUMBER;
    v_valorBaseRateioFinancFrete   NUMBER;
    v_valorBaseRateioDescontoGeral NUMBER;
    v_valorBaseRateioPagamento     NUMBER;
    v_valorBaseRateioPagamFinanc   NUMBER;
    v_valorBaseRateioPagamDesconto NUMBER;
    v_valorBaseRateioPagamFinDesc  NUMBER;
    v_saldoRatFreteGeral           NUMBER;
    v_saldoRatSeguroGeral          NUMBER;
    v_saldoRatDescontoGeral        NUMBER;
    v_saldoRatOutrasDespesasGeral  NUMBER;
    v_saldoRatAdicFreteMarinGeral  NUMBER;
    v_saldoRatDespesasAduanGeral   NUMBER;
    v_saldoRatDescontoPagamento    NUMBER;
    v_saldoRatOutrasDespPagamento  NUMBER;
    v_saldoRatJurosPagamento       NUMBER;
    v_saldoRatDescCustoOpGeral     NUMBER;
    v_saldoRatAcrescCustoOpGeral   NUMBER;
    v_saldoRatAcrescExtempGeral    NUMBER;
    v_residuoFreteGeral            NUMBER;
    v_residuoSeguroGeral           NUMBER;
    v_residuoDescontoGeral         NUMBER;
    v_residuoOutrasDespesasGeral   NUMBER;
    v_residuoAdicFreteMarinGeral   NUMBER;
    v_residuoDespesasAduanGeral    NUMBER;
    v_residuoDescontoPagamento     NUMBER;
    v_residuoOutrasDespPagamento   NUMBER;
    v_residuoJurosPagamento        NUMBER;
    v_residuoDescCustoOpGeral      NUMBER;
    v_residuoAcrescCustoOpGeral    NUMBER;
    v_residuoAcrescExtempGeral     NUMBER;
    v_idItemDocFiscalUltimoItem    NUMBER;
    v_idItemDocFiscalRateioFrete   NUMBER;
    v_precoUnitario                NUMBER;
    v_precoUnitarioConvertido      NUMBER;
    v_valorProdutoServico          NUMBER;
    v_valorFreteGeral              NUMBER;
    v_valorSeguroGeral             NUMBER;
    v_valorDescontoGeral           NUMBER;
    v_valorOutrasDespesasGeral     NUMBER;
    v_valorAdicFreteMarinMerGeral  NUMBER;
    v_valorDespesasAduaneirasGeral NUMBER;
    v_valorBasePagamento           NUMBER;
    v_valorDescontoPagamento       NUMBER;
    v_valorOutrasDespesasPagamento NUMBER;
    v_valorJurosPagamento          NUMBER;
    v_valorFreteTotal              NUMBER;
    v_valorSeguroTotal             NUMBER;
    v_valorDescontoTotal           NUMBER;
    v_valorOutrasDespesasTotal     NUMBER;
    v_valorAdicFreteMarinMerTotal  NUMBER;
    v_valorDespesasAduaneirasTotal NUMBER;
    v_valorImpSomaPagamento        NUMBER;
    v_valorImpDiminuiPagamento     NUMBER;
    v_valorLiquidoItem             NUMBER;
    v_valorDescontoCustoOpGeral    NUMBER;
    v_valorDescontoCustoOpTotal    NUMBER;
    v_valorAcrescimoCustoOpGeral   NUMBER;
    v_valorAcrescimoCustoOpTotal   NUMBER;
    v_precoCustoOperacao           NUMBER;
    v_valorCustoOperacao           NUMBER;
    v_precoCMV                     NUMBER;
    v_valorCMV                     NUMBER;
    v_valorAcrescimoExtempSubtotal NUMBER;
    v_valorAcrescimoExtempGeral    NUMBER;
    v_valorAcrescimoExtempTotal    NUMBER;
    v_calculoImpostosPendenteItem  NUMBER;
    CURSOR c_item IS
      SELECT
        a.idItemDocFiscal,
        a.servico,
        a.geraFinanceiro,
        a.quantidade,
        a.quantidadeConvertida,
        a.usarPrecoAVista,
        a.precoUnitarioBruto,
        a.acrescimoUnitarioComposicao,
        a.precoUnitario,
        a.precoUnitarioConvertido,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorBasePagamento,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorIRRF,
        a.valorINSS,
        a.valorRetPIS,
        a.valorRetCOFINS,
        a.valorRetCSLL,
        a.valorII,
        a.valorIOF,
        a.valorIPI,
        a.valorIPIDevolucao,
        a.valorPIS,
        a.valorPISST,
        a.valorCOFINS,
        a.valorCOFINSST,
        a.valorCreditoSimplesNacional,
        a.valorICMS,
        a.valorICMSST,
        a.valorICMSSTEscrituracao,
        a.somarICMSST,
        a.valorImpostosSomaPagamento,
        a.valorImpostosDiminuiPagamento,
        a.valorLiquidoItem,
        a.valorDescontoCustoOpItem,
        a.valorDescontoCustoOpGeral,
        a.valorDescontoCustoOpTotal,
        a.valorAcrescimoCustoOpItem,
        a.valorAcrescimoCustoOpGeral,
        a.valorAcrescimoCustoOpTotal,
        a.precoCustoOperacao,
        a.valorCustoOperacao,
        a.precoCMV,
        a.valorCMV,
        a.quantidadeExtemporanea,
        a.acrescimoUnitarioExtemporaneo,
        a.valorAcrescimoExtempSubtotal,
        a.valorAcrescimoExtempItem,
        a.valorAcrescimoExtempGeral,
        a.valorAcrescimoExtempTotal,
        CASE WHEN p_modDoc_habilitaControleEntr = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = a.idItemDocFiscal AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END rateioFrete,
        CASE WHEN a.precoSugestaoAPrazo <> a.precoSugestaoAVista AND a.usarPrecoAVista = 1 THEN 1 ELSE 0 END aVista,
        CASE WHEN EXISTS(SELECT 1 FROM MODOCFISCALXPROMOCOES promo WHERE promo.idItemDocFiscal = a.idItemDocFiscal) THEN 1 ELSE 0 END promocao,
        COALESCE((SELECT SUM(promo.valorDesconto) FROM MODOCFISCALXPROMOCOES promo WHERE promo.idItemDocFiscal = a.idItemDocFiscal AND promo.cabecalhoItemPagamento ='C'),0) valorDescontoPromocaoGeral,
        COALESCE((SELECT SUM(promo.valorDesconto) FROM MODOCFISCALXPROMOCOES promo WHERE promo.idItemDocFiscal = a.idItemDocFiscal AND promo.cabecalhoItemPagamento ='P'),0) valorDescontoPromocaoPagamento
      FROM MODOCFISCALXITENS a
      WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
      AND a.cancelado = 0
      ORDER BY a.sequencia;
BEGIN
  r_cab_valorProdutos            := 0;
  r_cab_valorServicos            := 0;
  r_cab_valorBasePagamento       := 0;
  r_cab_valorAVistaMinimo        := 0;
  r_cab_valorFreteTotal          := 0;
  r_cab_valorSeguroTotal         := 0;
  r_cab_valorDescontoTotal       := 0;
  r_cab_valorOutrasDespesasTotal := 0;
  r_cab_valorAdicFreteMarinTotal := 0;
  r_cab_valorDespesasAduanTotal  := 0;
  r_cab_valorImpSomaPagamento    := 0;
  r_cab_valorImpDiminuiPagamento := 0;
  r_cab_valorLiquidoItem         := 0;
  r_cab_valorDescCustoOpTotal    := 0;
  r_cab_valorAcrescCustoOpTotal  := 0;
  r_cab_valorCustoOperacao       := 0;
  r_cab_valorCMV                 := 0;
  r_cab_valorAcrescExtempTotal   := 0;
  r_calcularImpostosItem         := 0;
  v_saldoRatFreteGeral           := p_cab_valorFreteGeral;
  v_saldoRatSeguroGeral          := p_cab_valorSeguroGeral;
  v_saldoRatDescontoGeral        := p_cab_valorDescontoGeral;
  v_saldoRatOutrasDespesasGeral  := p_cab_valorOutrasDespesasGeral;
  v_saldoRatAdicFreteMarinGeral  := p_cab_valorAdicFreteMarinGeral;
  v_saldoRatDespesasAduanGeral   := p_cab_valorDespesasAduanGeral;
  v_saldoRatDescontoPagamento    := p_cab_valorDescontoPagamento;
  v_saldoRatOutrasDespPagamento  := p_cab_valorOutrasDespPagamento;
  v_saldoRatJurosPagamento       := p_cab_valorJurosPagamento;
  v_saldoRatDescCustoOpGeral     := p_cab_valorDescCustoOpGeral;
  v_saldoRatAcrescCustoOpGeral   := p_cab_valorAcrescCustoOpGeral;
  v_saldoRatAcrescExtempGeral    := p_cab_valorAcrescExtempGeral;
  v_residuoFreteGeral            := 0;
  v_residuoSeguroGeral           := 0;
  v_residuoDescontoGeral         := 0;
  v_residuoOutrasDespesasGeral   := 0;
  v_residuoAdicFreteMarinGeral   := 0;
  v_residuoDespesasAduanGeral    := 0;
  v_residuoDescontoPagamento     := 0;
  v_residuoOutrasDespPagamento   := 0;
  v_residuoJurosPagamento        := 0;
  v_residuoDescCustoOpGeral      := 0;
  v_residuoAcrescCustoOpGeral    := 0;
  v_residuoAcrescExtempGeral     := 0;
  v_idItemDocFiscalUltimoItem    := 0;
  v_idItemDocFiscalRateioFrete   := 0;
  v_valorDescontoPromocaoGeral   := 0;
  v_valorDescontoPromocaoPagamen := 0;
  v_rateioDescontofiltrarSemProm := 0;
  v_rateioDescontofiltrarAPrazo  := 0;
  
  -- v_valorDescontoPromocaoGeral
  IF p_cab_valorDescontoGeral > 0 THEN
    SELECT COALESCE(SUM(promo.valorDesconto),0)
    INTO v_valorDescontoPromocaoGeral
    FROM MODOCFISCALXITENS a
    JOIN MODOCFISCALXPROMOCOES promo ON promo.idItemDocFiscal = a.idItemDocFiscal
    WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
    AND a.cancelado = 0
    AND promo.cabecalhoItemPagamento ='C';
  END IF;
  
  -- v_valorDescontoPromocaoPagamen
  IF p_cab_valorDescontoPagamento > 0 THEN
    SELECT COALESCE(SUM(promo.valorDesconto),0)
    INTO v_valorDescontoPromocaoPagamen
    FROM MODOCFISCALXITENS a
    JOIN MODOCFISCALXPROMOCOES promo ON promo.idItemDocFiscal = a.idItemDocFiscal
    WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
    AND a.cancelado = 0
    AND promo.cabecalhoItemPagamento ='P';
  END IF;

  -- v_rateioDescontofiltrarSemProm
  IF p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral OR p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
    SELECT
      CASE
        WHEN EXISTS(
          SELECT 1
          FROM MODOCFISCALXITENS a
          WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
          AND a.cancelado = 0
          AND COALESCE((
            SELECT SUM(b.valorDesconto)
            FROM MODOCFISCALXPROMOCOES b
            WHERE b.idItemDocFiscal = a.idItemDocFiscal
            AND b.cabecalhoItemPagamento IN ('C','P')),0) > (
            CASE
              WHEN p_modDoc_diminuiDescontoPrUnit = 1
                OR p_modDoc_somaAcrescimosPrUnit  = 1
                OR p_modDoc_somaFreteSeguroPrUnit = 1
              THEN a.valorProdutoServicoBruto
              ELSE a.valorProdutoServico
            END
            - a.valorDescontoItem
            + a.valorAcrescimoItem))
        THEN 0
        WHEN COALESCE ((
          SELECT SUM (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem)
          FROM MODOCFISCALXITENS a
          JOIN MODOCFISCALXPROMOCOES b ON b.idItemDocFiscal = a.idItemDocFiscal
          WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
          AND a.cancelado = 0),0) > (
            CASE
              WHEN p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral
              THEN p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral
              ELSE 0
            END +
            CASE
              WHEN p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen
              THEN p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen
              ELSE 0
            END)
          AND EXISTS (
            SELECT 1
            FROM MODOCFISCALXITENS a
            WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
            AND a.cancelado = 0
            AND NOT (EXISTS(
              SELECT 1
              FROM MODOCFISCALXPROMOCOES b
              WHERE b.idItemDocFiscal = a.idItemDocFiscal)))
        THEN 1
        ELSE 0
      END
    INTO v_rateioDescontofiltrarSemProm
    FROM DUAL;
  END IF;

  -- v_rateioDescontofiltrarAPrazo
  IF p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral OR p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
    SELECT
      CASE
        WHEN COALESCE ((
          SELECT SUM (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem)
          FROM MODOCFISCALXITENS a
          WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
          AND a.cancelado = 0
          AND a.precoSugestaoAPrazo <> a.precoSugestaoAVista
          AND a.usarPrecoAVista = 1
          AND (v_rateioDescontofiltrarSemProm = 0
            OR NOT(EXISTS(
              SELECT 1
              FROM MODOCFISCALXPROMOCOES promo
              WHERE promo.idItemDocFiscal = a.idItemDocFiscal)))),0) > (
            CASE
              WHEN p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral
              THEN p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral
              ELSE 0
            END +
            CASE
              WHEN p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen
              THEN p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen
              ELSE 0
            END)
          AND EXISTS (
            SELECT 1
            FROM MODOCFISCALXITENS a
            WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
            AND a.cancelado = 0
            AND (a.precoSugestaoAPrazo = a.precoSugestaoAVista
              OR a.usarPrecoAVista = 0)
            AND (v_rateioDescontofiltrarSemProm = 0
              OR NOT(EXISTS(
                SELECT 1
                FROM MODOCFISCALXPROMOCOES promo
                WHERE promo.idItemDocFiscal = a.idItemDocFiscal))))
        THEN 1
        ELSE 0
      END
    INTO v_rateioDescontofiltrarAPrazo
    FROM DUAL;
  END IF;
  
  -- Bases Rateio
  SELECT
    MAX(COALESCE((CASE WHEN p_modDoc_habilitaControleEntr = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = a.idItemDocFiscal AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END),0)),
    COALESCE(SUM(CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem),0),
    COALESCE(SUM(CASE WHEN p_modDoc_habilitaControleEntr = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = a.idItemDocFiscal AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 AND (p_modDoc_habilitaControleEntr = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = a.idItemDocFiscal AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1)) THEN CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR a.precoSugestaoAPrazo = a.precoSugestaoAVista OR a.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MODOCFISCALXPROMOCOES promo WHERE promo.idItemDocFiscal = a.idItemDocFiscal))) THEN CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR a.precoSugestaoAPrazo = a.precoSugestaoAVista OR a.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MODOCFISCALXPROMOCOES promo WHERE promo.idItemDocFiscal = a.idItemDocFiscal))) THEN CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 AND (v_rateioDescontofiltrarAPrazo = 0 OR a.precoSugestaoAPrazo = a.precoSugestaoAVista OR a.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MODOCFISCALXPROMOCOES promo WHERE promo.idItemDocFiscal = a.idItemDocFiscal))) THEN CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0)
  INTO
    v_rateioFretePorControleEntr,
    v_valorBaseRateio,
    v_valorBaseRateioFrete,
    v_valorBaseRateioFinanceiro,
    v_valorBaseRateioFinancFrete,
    v_valorBaseRateioDescontoGeral,
    v_valorBaseRateioPagamento,
    v_valorBaseRateioPagamFinanc,
    v_valorBaseRateioPagamDesconto,
    v_valorBaseRateioPagamFinDesc
  FROM MODOCFISCALXITENS a
  WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND a.cancelado = 0;

  -- Efetua rateio
  FOR item IN c_item LOOP
    v_idItemDocFiscalUltimoItem    := item.idItemDocFiscal;
    v_precoUnitario                := item.precoUnitario;
    v_precoUnitarioConvertido      := item.precoUnitarioConvertido;
    v_valorProdutoServico          := item.valorProdutoServico;
    v_valorBasePagamento           := item.valorBasePagamento;
    v_valorFreteTotal              := item.valorFreteTotal;
    v_valorSeguroTotal             := item.valorSeguroTotal;
    v_valorDescontoTotal           := item.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := item.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := item.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := item.valorDespesasAduaneirasTotal;
    v_valorImpSomaPagamento        := item.valorImpostosSomaPagamento;
    v_valorImpDiminuiPagamento     := item.valorImpostosDiminuiPagamento;
    v_valorLiquidoItem             := item.valorLiquidoItem;
    v_valorDescontoCustoOpTotal    := item.valorDescontoCustoOpTotal;
    v_valorAcrescimoCustoOpTotal   := item.valorAcrescimoCustoOpTotal;
    v_precoCustoOperacao           := item.precoCustoOperacao;
    v_valorCustoOperacao           := item.valorCustoOperacao;
    v_precoCMV                     := item.precoCMV;
    v_valorCMV                     := item.valorCMV;
    v_valorAcrescimoExtempSubtotal := item.valorAcrescimoExtempSubtotal;
    v_valorAcrescimoExtempTotal    := item.valorAcrescimoExtempTotal;

    IF CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END > 0 THEN
      IF item.geraFinanceiro = 1 AND (v_rateioFretePorControleEntr = 0 OR item.rateioFrete = 1) THEN
        v_idItemDocFiscalRateioFrete := item.idItemDocFiscal;
      END IF;
    ELSIF v_rateioFretePorControleEntr = 0 OR item.rateioFrete = 1 THEN
      v_idItemDocFiscalRateioFrete := item.idItemDocFiscal;
    END IF;

    -- v_valorFreteGeral
    v_auxNumber := v_residuoFreteGeral +
      CASE
        WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END > 0
        THEN 
          CASE
            WHEN item.geraFinanceiro = 1 AND (v_rateioFretePorControleEntr = 0 OR item.rateioFrete = 1)
            THEN
              CASE
                WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END = 0
                THEN 0
                ELSE p_cab_valorFreteGeral
                  * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
                  / CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END
              END
            ELSE 0
          END
        WHEN v_rateioFretePorControleEntr = 0 OR item.rateioFrete = 1
        THEN
          CASE
            WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFrete ELSE v_valorBaseRateio END = 0
            THEN 0
            ELSE p_cab_valorFreteGeral
              * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
              / CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFrete ELSE v_valorBaseRateio END
          END
        ELSE 0
      END;
    v_valorFreteGeral := ROUND (v_auxNumber,2);
    v_residuoFreteGeral := v_auxNumber - v_valorFreteGeral;
    v_saldoRatFreteGeral := v_saldoRatFreteGeral - v_valorFreteGeral;

    -- v_valorSeguroGeral
    v_auxNumber := v_residuoSeguroGeral +
      CASE
        WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END > 0
        THEN 
          CASE
            WHEN item.geraFinanceiro = 1 AND (v_rateioFretePorControleEntr = 0 OR item.rateioFrete = 1)
            THEN
              CASE
                WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END = 0
                THEN 0
                ELSE p_cab_valorSeguroGeral
                  * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
                  / CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END
              END
            ELSE 0
          END
        WHEN v_rateioFretePorControleEntr = 0 OR item.rateioFrete = 1
        THEN
          CASE
            WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFrete ELSE v_valorBaseRateio END = 0
            THEN 0
            ELSE p_cab_valorSeguroGeral
              * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
              / CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFrete ELSE v_valorBaseRateio END
          END
        ELSE 0
      END;
    v_valorSeguroGeral := ROUND (v_auxNumber,2);
    v_residuoSeguroGeral := v_auxNumber - v_valorSeguroGeral;
    v_saldoRatSeguroGeral := v_saldoRatSeguroGeral - v_valorSeguroGeral;

    -- v_valorAdicFreteMarinMerGeral
    v_auxNumber := v_residuoAdicFreteMarinGeral +
      CASE
        WHEN v_valorBaseRateioFinanceiro > 0 AND item.geraFinanceiro = 1
        THEN p_cab_valorAdicFreteMarinGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
        WHEN v_valorBaseRateioFinanceiro <= 0 AND v_valorBaseRateio > 0
        THEN p_cab_valorAdicFreteMarinGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateio
        ELSE 0
      END;
    v_valorAdicFreteMarinMerGeral := ROUND (v_auxNumber,2);
    v_residuoAdicFreteMarinGeral := v_auxNumber - v_valorAdicFreteMarinMerGeral;
    v_saldoRatAdicFreteMarinGeral := v_saldoRatAdicFreteMarinGeral - v_valorAdicFreteMarinMerGeral;

    -- v_valorDespesasAduaneirasGeral
    v_auxNumber := v_residuoDespesasAduanGeral +
      CASE
        WHEN v_valorBaseRateioFinanceiro > 0 AND item.geraFinanceiro = 1
        THEN p_cab_valorDespesasAduanGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
        WHEN v_valorBaseRateioFinanceiro <= 0 AND v_valorBaseRateio > 0
        THEN p_cab_valorDespesasAduanGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateio
        ELSE 0
      END;
    v_valorDespesasAduaneirasGeral := ROUND (v_auxNumber,2);
    v_residuoDespesasAduanGeral := v_auxNumber - v_valorDespesasAduaneirasGeral;
    v_saldoRatDespesasAduanGeral := v_saldoRatDespesasAduanGeral - v_valorDespesasAduaneirasGeral;

    -- v_valorDescontoCustoOpGeral
    v_auxNumber := v_residuoDescCustoOpGeral +
      CASE
        WHEN v_valorBaseRateioFinanceiro > 0 AND item.geraFinanceiro = 1
        THEN p_cab_valorDescCustoOpGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
        WHEN v_valorBaseRateioFinanceiro <= 0 AND v_valorBaseRateio > 0
        THEN p_cab_valorDescCustoOpGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateio
        ELSE 0
      END;
    v_valorDescontoCustoOpGeral := ROUND (v_auxNumber,2);
    v_residuoDescCustoOpGeral := v_auxNumber - v_valorDescontoCustoOpGeral;
    v_saldoRatDescCustoOpGeral := v_saldoRatDescCustoOpGeral - v_valorDescontoCustoOpGeral;

    -- v_valorAcrescimoCustoOpGeral
    v_auxNumber := v_residuoAcrescCustoOpGeral +
      CASE
        WHEN v_valorBaseRateioFinanceiro > 0 AND item.geraFinanceiro = 1
        THEN p_cab_valorAcrescCustoOpGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
        WHEN v_valorBaseRateioFinanceiro <= 0 AND v_valorBaseRateio > 0
        THEN p_cab_valorAcrescCustoOpGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateio
        ELSE 0
      END;
    v_valorAcrescimoCustoOpGeral := ROUND (v_auxNumber,2);
    v_residuoAcrescCustoOpGeral := v_auxNumber - v_valorAcrescimoCustoOpGeral;
    v_saldoRatAcrescCustoOpGeral := v_saldoRatAcrescCustoOpGeral - v_valorAcrescimoCustoOpGeral;

    -- v_valorAcrescimoExtempGeral
    v_auxNumber := v_residuoAcrescExtempGeral +
      CASE
        WHEN v_valorBaseRateioFinanceiro > 0 AND item.geraFinanceiro = 1
        THEN p_cab_valorAcrescExtempGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
        WHEN v_valorBaseRateioFinanceiro <= 0 AND v_valorBaseRateio > 0
        THEN p_cab_valorAcrescExtempGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateio
        ELSE 0
      END;
    v_valorAcrescimoExtempGeral := ROUND (v_auxNumber,2);
    v_residuoAcrescExtempGeral := v_auxNumber - v_valorAcrescimoExtempGeral;
    v_saldoRatAcrescExtempGeral := v_saldoRatAcrescExtempGeral - v_valorAcrescimoExtempGeral;

    -- v_valorOutrasDespesasGeral
    v_auxNumber := v_residuoOutrasDespesasGeral +
      CASE
        WHEN v_valorBaseRateioFinanceiro > 0 AND item.geraFinanceiro = 1
        THEN p_cab_valorOutrasDespesasGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
        WHEN v_valorBaseRateioFinanceiro <= 0 AND v_valorBaseRateio > 0
        THEN p_cab_valorOutrasDespesasGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateio
        ELSE 0
      END;
    v_valorOutrasDespesasGeral := ROUND (v_auxNumber,2);
    v_residuoOutrasDespesasGeral := v_auxNumber - v_valorOutrasDespesasGeral;
    v_saldoRatOutrasDespesasGeral := v_saldoRatOutrasDespesasGeral - v_valorOutrasDespesasGeral;

    -- v_valorOutrasDespesasPagamento
    v_auxNumber := v_residuoOutrasDespPagamento +
      CASE
        WHEN v_valorBaseRateioPagamFinanc > 0 AND item.geraFinanceiro = 1
        THEN p_cab_valorOutrasDespPagamento
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioPagamFinanc
        WHEN v_valorBaseRateioPagamFinanc <= 0 AND v_valorBaseRateioPagamento > 0
        THEN p_cab_valorOutrasDespPagamento
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioPagamento
        ELSE 0
      END;
    v_valorOutrasDespesasPagamento := ROUND (v_auxNumber,2);
    v_residuoOutrasDespPagamento := v_auxNumber - v_valorOutrasDespesasPagamento;
    v_saldoRatOutrasDespPagamento := v_saldoRatOutrasDespPagamento - v_valorOutrasDespesasPagamento;

    -- v_valorJurosPagamento
    v_auxNumber := v_residuoJurosPagamento +
      CASE
        WHEN v_valorBaseRateioPagamFinanc > 0 AND item.geraFinanceiro = 1
        THEN p_cab_valorJurosPagamento
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioPagamFinanc
        WHEN v_valorBaseRateioPagamFinanc <= 0 AND v_valorBaseRateioPagamento > 0
        THEN p_cab_valorJurosPagamento
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioPagamento
        ELSE 0
      END;
    v_valorJurosPagamento := ROUND (v_auxNumber,2);
    v_residuoJurosPagamento := v_auxNumber - v_valorJurosPagamento;
    v_saldoRatJurosPagamento := v_saldoRatJurosPagamento - v_valorJurosPagamento;

    -- v_valorDescontoGeral
    v_auxNumber := v_residuoDescontoGeral +
      CASE
        WHEN v_valorBaseRateioDescontoGeral = 0
          OR v_rateioDescontofiltrarSemProm = 1 AND p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral <= 0
          OR v_rateioDescontofiltrarAPrazo  = 1 AND item.aVista = 1
          OR v_rateioDescontofiltrarSemProm = 1 AND item.promocao = 1
        THEN 0
        ELSE (p_cab_valorDescontoGeral - CASE WHEN v_rateioDescontofiltrarSemProm = 1 THEN v_valorDescontoPromocaoGeral ELSE 0 END)
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioDescontoGeral
      END +
      CASE
        WHEN p_cab_valorDescontoGeral = 0 OR v_valorDescontoPromocaoGeral = 0 OR item.valorDescontoPromocaoGeral = 0 OR v_rateioDescontofiltrarSemProm = 0
        THEN 0
        WHEN p_cab_valorDescontoGeral < v_valorDescontoPromocaoGeral
        THEN item.valorDescontoPromocaoGeral * p_cab_valorDescontoGeral / v_valorDescontoPromocaoGeral
        ELSE item.valorDescontoPromocaoGeral
      END;
    IF ROUND (v_auxNumber,2) >= v_saldoRatDescontoGeral THEN
      v_valorDescontoGeral := v_saldoRatDescontoGeral;
      v_residuoDescontoGeral := 0;
    ELSE
      v_valorDescontoGeral := ROUND (v_auxNumber,2);
      v_residuoDescontoGeral := v_auxNumber - v_valorDescontoGeral;
    END IF;
    v_saldoRatDescontoGeral := v_saldoRatDescontoGeral - v_valorDescontoGeral;

    -- v_valorDescontoPagamento
    v_auxNumber := v_residuoDescontoPagamento +
      CASE
        WHEN v_valorBaseRateioPagamFinDesc > 0 AND item.geraFinanceiro = 1
        THEN
          CASE
            WHEN p_cab_valorDescontoPagamento = 0
              OR v_rateioDescontofiltrarSemProm = 1 AND p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen <= 0
              OR v_rateioDescontofiltrarAPrazo  = 1 AND item.aVista = 1
              OR v_rateioDescontofiltrarSemProm = 1 AND item.promocao = 1
            THEN 0
            ELSE (p_cab_valorDescontoPagamento - CASE WHEN v_rateioDescontofiltrarSemProm = 1 THEN v_valorDescontoPromocaoPagamen ELSE 0 END)
              * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
              / v_valorBaseRateioPagamFinDesc
          END
        WHEN v_valorBaseRateioPagamFinDesc <= 0 AND v_valorBaseRateioPagamDesconto > 0
        THEN
          CASE
            WHEN p_cab_valorDescontoPagamento = 0
              OR v_rateioDescontofiltrarSemProm = 1 AND p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen <= 0
              OR v_rateioDescontofiltrarAPrazo  = 1 AND item.aVista = 1
              OR v_rateioDescontofiltrarSemProm = 1 AND item.promocao = 1
            THEN 0
            ELSE (p_cab_valorDescontoPagamento - CASE WHEN v_rateioDescontofiltrarSemProm = 1 THEN v_valorDescontoPromocaoPagamen ELSE 0 END)
              * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
              / v_valorBaseRateioPagamDesconto
          END
        ELSE 0
      END +
      CASE
        WHEN p_cab_valorDescontoPagamento = 0 OR v_valorDescontoPromocaoPagamen = 0 OR item.valorDescontoPromocaoPagamento = 0 OR v_rateioDescontofiltrarSemProm = 0
        THEN 0
        WHEN p_cab_valorDescontoPagamento < v_valorDescontoPromocaoPagamen
        THEN item.valorDescontoPromocaoPagamento * p_cab_valorDescontoPagamento / v_valorDescontoPromocaoPagamen
        ELSE item.valorDescontoPromocaoPagamento
      END;
    IF ROUND (v_auxNumber,2) >= v_saldoRatDescontoPagamento THEN
      v_valorDescontoPagamento := v_saldoRatDescontoPagamento;
      v_residuoDescontoPagamento := 0;
    ELSE
      v_valorDescontoPagamento := ROUND (v_auxNumber,2);
      v_residuoDescontoPagamento := v_auxNumber - v_valorDescontoPagamento;
    END IF;
    v_saldoRatDescontoPagamento := v_saldoRatDescontoPagamento - v_valorDescontoPagamento;

    -- Recalcula Valores
    ADD_CALCULA_TOTAIS_ITEM(
      p_cab_tipoPagamentoFrete,
      p_modDoc_diminuiDescontoPrUnit,
      p_modDoc_somaAcrescimosPrUnit,
      p_modDoc_somaFreteSeguroPrUnit,
      item.quantidade,
      item.quantidadeConvertida,
      item.precoUnitarioBruto,
      item.acrescimoUnitarioComposicao,
      item.precoUnitario,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      v_valorFreteGeral,
      v_valorSeguroGeral,
      v_valorDescontoGeral,
      v_valorOutrasDespesasGeral,
      v_valorAdicFreteMarinMerGeral,
      v_valorDespesasAduaneirasGeral,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      item.quantidadeExtemporanea,
      item.acrescimoUnitarioExtemporaneo,
      item.valorAcrescimoExtempItem,
      v_valorAcrescimoExtempGeral,
      /* Retornos */
      v_precoUnitario,
      v_precoUnitarioConvertido,
      v_valorProdutoServico,
      v_auxNumber,
      v_auxNumber,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      v_valorAcrescimoExtempSubtotal,
      v_valorAcrescimoExtempTotal);
    IF p_cab_impostosEditados = 0 
        OR v_valorProdutoServico <> item.valorProdutoServico
        OR CASE WHEN p_cab_tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorFreteTotal END
        <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE p_cab_tipoPagamentoFrete END = 'V' THEN 0 ELSE item.valorFreteTotal END
        OR CASE WHEN p_cab_tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorSeguroTotal END
        <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE p_cab_tipoPagamentoFrete END = 'V' THEN 0 ELSE item.valorSeguroTotal END
        OR v_valorDescontoTotal <> item.valorDescontoTotal
        OR v_valorOutrasDespesasTotal <> item.valorOutrasDespesasTotal
        OR v_valorAdicFreteMarinMerTotal <> item.valorAdicFreteMarinhaMerTotal
        OR v_valorDespesasAduaneirasTotal <> item.valorDespesasAduaneirasTotal
        OR v_precoUnitario <> item.precoUnitario
        OR v_valorProdutoServico <> item.valorProdutoServico
    THEN
      r_calcularImpostosItem := 1;
    END IF;
    ADD_CALCULA_VALOR_LIQUIDO (
      p_cab_nfFornecedor,
      p_cab_tipoPagamentoFrete,
      item.geraFinanceiro,
      v_valorProdutoServico,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      item.valorIRRF,
      item.valorINSS,
      item.valorRetPIS,
      item.valorRetCOFINS,
      item.valorRetCSLL,
      item.valorII,
      item.valorIOF,
      item.valorIPI,
      item.valorIPIDevolucao,
      item.valorICMSST,
      item.valorICMSSTEscrituracao,
      item.somarICMSST,
      v_valorAcrescimoExtempTotal,
      /* Retornos */
      v_valorBasePagamento,
      v_valorImpSomaPagamento,
      v_valorImpDiminuiPagamento,
      v_valorLiquidoItem);
    ADD_CALCULA_CUSTO_CMV (
      p_cab_modeloDocumento,
      p_cab_atualizaCustoMedio,
      p_cab_nfFornecedor,
      item.quantidade,
      item.valorII,
      item.valorIOF,
      item.valorIPI,
      item.valorIPIDevolucao,
      item.valorPIS,
      item.valorPISST,
      item.valorCOFINS,
      item.valorCOFINSST,
      item.valorCreditoSimplesNacional,
      item.valorICMS,
      item.valorICMSST,
      item.valorICMSSTEscrituracao,
      v_valorLiquidoItem,
      item.valorDescontoCustoOpItem,
      v_valorDescontoCustoOpGeral,
      item.valorAcrescimoCustoOpItem,
      v_valorAcrescimoCustoOpGeral,
      v_valorAcrescimoExtempTotal,
      /* Retornos */
      v_valorDescontoCustoOpTotal,
      v_valorAcrescimoCustoOpTotal,
      v_precoCustoOperacao,
      v_valorCustoOperacao,
      v_precoCMV,
      v_valorCMV);

    -- Atualiza Item
    UPDATE MODOCFISCALXITENS SET
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorFreteGeral               = v_valorFreteGeral,
      valorSeguroGeral              = v_valorSeguroGeral,
      valorDescontoGeral            = v_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
      valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
      valorBasePagamento            = v_valorBasePagamento,
      valorDescontoPagamento        = v_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
      valorJurosPagamento           = v_valorJurosPagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      valorImpostosSomaPagamento    = v_valorImpSomaPagamento,
      valorImpostosDiminuiPagamento = v_valorImpDiminuiPagamento,
      valorLiquidoItem              = v_valorLiquidoItem,
      valorDescontoCustoOpGeral     = v_valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpGeral    = v_valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
      precoCustoOperacao            = v_precoCustoOperacao,
      valorCustoOperacao            = v_valorCustoOperacao,
      precoCMV                      = v_precoCMV,
      valorCMV                      = v_valorCMV,
      valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempGeral     = v_valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
    WHERE idItemDocFiscal           = item.idItemDocFiscal;
    IF item.servico = 1 THEN
      r_cab_valorServicos            := r_cab_valorServicos + v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos            := r_cab_valorProdutos + v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_valorBasePagamento;
    IF item.usarPrecoAVista = 1 AND item.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
    r_cab_valorImpSomaPagamento    := r_cab_valorImpSomaPagamento + v_valorImpSomaPagamento;
    r_cab_valorImpDiminuiPagamento := r_cab_valorImpDiminuiPagamento + v_valorImpDiminuiPagamento;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
    r_cab_valorDescCustoOpTotal    := r_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
    r_cab_valorAcrescCustoOpTotal  := r_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
    r_cab_valorCustoOperacao       := r_cab_valorCustoOperacao + v_valorCustoOperacao;
    r_cab_valorCMV                 := r_cab_valorCMV + v_valorCMV;
    r_cab_valorAcrescExtempTotal   := r_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
  END LOOP;
  IF v_idItemDocFiscalUltimoItem <> 0 AND (v_saldoRatDescontoGeral <> 0 OR v_saldoRatOutrasDespesasGeral <> 0 OR v_saldoRatDescontoPagamento <> 0 OR v_saldoRatOutrasDespPagamento <> 0 OR v_saldoRatJurosPagamento <> 0 OR v_saldoRatFreteGeral <> 0 OR v_saldoRatSeguroGeral <> 0 OR v_saldoRatAdicFreteMarinGeral <> 0 OR v_saldoRatDespesasAduanGeral <> 0) THEN
    ADD_DOC_FISC_CALC_IMP_RESIDUO (
      p_troca_tipoPagamentoFrete,
      p_a_cab_tipoPagamentoFrete,
      p_cab_modeloDocumento,
      p_cab_entradaSaida,
      p_cab_devolucaoAnulacaoRetorno,
      p_cab_atualizaCustoMedio,
      p_cab_nfFornecedor,
      p_cab_tipoPagamentoFrete,
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      r_cab_valorDescontoTotal,
      r_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      p_cab_impostosEditados,
      r_cab_valorImpSomaPagamento,
      r_cab_valorImpDiminuiPagamento,
      r_cab_valorLiquidoItem,
      r_cab_valorDescCustoOpTotal,
      r_cab_valorAcrescCustoOpTotal,
      r_cab_valorCustoOperacao,
      r_cab_valorCMV,
      r_cab_valorAcrescExtempTotal,
      p_modDoc_diminuiDescontoPrUnit,
      p_modDoc_somaAcrescimosPrUnit,
      p_modDoc_somaFreteSeguroPrUnit,
      v_idItemDocFiscalUltimoItem,
      v_saldoRatFreteGeral,
      v_saldoRatSeguroGeral,
      v_saldoRatDescontoGeral,
      v_saldoRatOutrasDespesasGeral,
      v_saldoRatAdicFreteMarinGeral,
      v_saldoRatDespesasAduanGeral,
      v_saldoRatDescontoPagamento,
      v_saldoRatOutrasDespPagamento,
      v_saldoRatJurosPagamento,
      v_saldoRatDescCustoOpGeral,
      v_saldoRatAcrescCustoOpGeral,
      v_saldoRatAcrescExtempGeral,
      r_calcularImpostosItem,
      /* Retornos */
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      r_cab_valorDescontoTotal,
      r_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      r_cab_valorImpSomaPagamento,
      r_cab_valorImpDiminuiPagamento,
      r_cab_valorLiquidoItem,
      r_cab_valorDescCustoOpTotal,
      r_cab_valorAcrescCustoOpTotal,
      r_cab_valorCustoOperacao,
      r_cab_valorCMV,
      r_cab_valorAcrescExtempTotal,
      r_calcularImpostosItem);
  END IF;
END ADD_DOC_FISC_CALC_IMP_RATEIO;

/

create or replace PROCEDURE ADD_PRE_DOC_CALC_IMP_RATEIO (
    p_cab_preDocumento             IN NUMBER,
    p_troca_tipoPagamentoFrete     IN NUMBER,
    p_a_cab_tipoPagamentoFrete     IN CHAR,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_tipoPagamentoFrete       IN CHAR,
    p_cab_valorFreteGeral          IN NUMBER,
    p_cab_valorSeguroGeral         IN NUMBER,
    p_cab_valorDescontoGeral       IN NUMBER,
    p_cab_valorOutrasDespesasGeral IN NUMBER,
    p_cab_valorAdicFreteMarinGeral IN NUMBER,
    p_cab_valorDespesasAduanGeral  IN NUMBER,
    p_cab_valorDescontoPagamento   IN NUMBER,
    p_cab_valorOutrasDespPagamento IN NUMBER,
    p_cab_valorJurosPagamento      IN NUMBER,
    p_cab_impostosEditados         IN NUMBER,
    p_cab_valorDescCustoOpGeral    IN NUMBER,
    p_cab_valorAcrescCustoOpGeral  IN NUMBER,
    p_cab_valorAcrescExtempGeral   IN NUMBER,
    p_modDoc_diminuiDescontoPrUnit IN NUMBER,
    p_modDoc_somaAcrescimosPrUnit  IN NUMBER,
    p_modDoc_somaFreteSeguroPrUnit IN NUMBER,
    p_modDoc_habilitaControleEntr  IN NUMBER,
    /* Retornos */
    r_cab_valorProdutos            OUT NUMBER,
    r_cab_valorServicos            OUT NUMBER,
    r_cab_valorBasePagamento       OUT NUMBER,
    r_cab_valorAVistaMinimo        OUT NUMBER,
    r_cab_valorFreteTotal          OUT NUMBER,
    r_cab_valorSeguroTotal         OUT NUMBER,
    r_cab_valorDescontoTotal       OUT NUMBER,
    r_cab_valorOutrasDespesasTotal OUT NUMBER,
    r_cab_valorAdicFreteMarinTotal OUT NUMBER,
    r_cab_valorDespesasAduanTotal  OUT NUMBER,
    r_cab_valorImpSomaPagamento    OUT NUMBER,
    r_cab_valorImpDiminuiPagamento OUT NUMBER,
    r_cab_valorLiquidoItem         OUT NUMBER,
    r_cab_valorDescCustoOpTotal    OUT NUMBER,
    r_cab_valorAcrescCustoOpTotal  OUT NUMBER,
    r_cab_valorCustoOperacao       OUT NUMBER,
    r_cab_valorCMV                 OUT NUMBER,
    r_cab_valorAcrescExtempTotal   OUT NUMBER,
    r_calcularImpostosItem         OUT NUMBER)
IS
    v_auxNumber                    NUMBER;
    v_valorDescontoPromocaoGeral   NUMBER;
    v_valorDescontoPromocaoPagamen NUMBER;
    v_rateioDescontofiltrarSemProm NUMBER;
    v_rateioDescontofiltrarAPrazo  NUMBER;
    v_rateioFretePorControleEntr   NUMBER;
    v_valorBaseRateio              NUMBER;
    v_valorBaseRateioFrete         NUMBER;
    v_valorBaseRateioFinanceiro    NUMBER;
    v_valorBaseRateioFinancFrete   NUMBER;
    v_valorBaseRateioDescontoGeral NUMBER;
    v_valorBaseRateioPagamento     NUMBER;
    v_valorBaseRateioPagamFinanc   NUMBER;
    v_valorBaseRateioPagamDesconto NUMBER;
    v_valorBaseRateioPagamFinDesc  NUMBER;
    v_saldoRatFreteGeral           NUMBER;
    v_saldoRatSeguroGeral          NUMBER;
    v_saldoRatDescontoGeral        NUMBER;
    v_saldoRatOutrasDespesasGeral  NUMBER;
    v_saldoRatAdicFreteMarinGeral  NUMBER;
    v_saldoRatDespesasAduanGeral   NUMBER;
    v_saldoRatDescontoPagamento    NUMBER;
    v_saldoRatOutrasDespPagamento  NUMBER;
    v_saldoRatJurosPagamento       NUMBER;
    v_saldoRatDescCustoOpGeral     NUMBER;
    v_saldoRatAcrescCustoOpGeral   NUMBER;
    v_saldoRatAcrescExtempGeral    NUMBER;
    v_residuoFreteGeral            NUMBER;
    v_residuoSeguroGeral           NUMBER;
    v_residuoDescontoGeral         NUMBER;
    v_residuoOutrasDespesasGeral   NUMBER;
    v_residuoAdicFreteMarinGeral   NUMBER;
    v_residuoDespesasAduanGeral    NUMBER;
    v_residuoDescontoPagamento     NUMBER;
    v_residuoOutrasDespPagamento   NUMBER;
    v_residuoJurosPagamento        NUMBER;
    v_residuoDescCustoOpGeral      NUMBER;
    v_residuoAcrescCustoOpGeral    NUMBER;
    v_residuoAcrescExtempGeral     NUMBER;
    v_idItemPreDocUltimoItem       NUMBER;
    v_idItemPreDocRateioFrete      NUMBER;
    v_precoUnitario                NUMBER;
    v_precoUnitarioConvertido      NUMBER;
    v_valorProdutoServico          NUMBER;
    v_valorFreteGeral              NUMBER;
    v_valorSeguroGeral             NUMBER;
    v_valorDescontoGeral           NUMBER;
    v_valorOutrasDespesasGeral     NUMBER;
    v_valorAdicFreteMarinMerGeral  NUMBER;
    v_valorDespesasAduaneirasGeral NUMBER;
    v_valorBasePagamento           NUMBER;
    v_valorDescontoPagamento       NUMBER;
    v_valorOutrasDespesasPagamento NUMBER;
    v_valorJurosPagamento          NUMBER;
    v_valorFreteTotal              NUMBER;
    v_valorSeguroTotal             NUMBER;
    v_valorDescontoTotal           NUMBER;
    v_valorOutrasDespesasTotal     NUMBER;
    v_valorAdicFreteMarinMerTotal  NUMBER;
    v_valorDespesasAduaneirasTotal NUMBER;
    v_valorImpSomaPagamento        NUMBER;
    v_valorImpDiminuiPagamento     NUMBER;
    v_valorLiquidoItem             NUMBER;
    v_valorDescontoCustoOpGeral    NUMBER;
    v_valorDescontoCustoOpTotal    NUMBER;
    v_valorAcrescimoCustoOpGeral   NUMBER;
    v_valorAcrescimoCustoOpTotal   NUMBER;
    v_precoCustoOperacao           NUMBER;
    v_valorCustoOperacao           NUMBER;
    v_precoCMV                     NUMBER;
    v_valorCMV                     NUMBER;
    v_valorAcrescimoExtempSubtotal NUMBER;
    v_valorAcrescimoExtempGeral    NUMBER;
    v_valorAcrescimoExtempTotal    NUMBER;
    v_calculoImpostosPendenteItem  NUMBER;
    CURSOR c_item IS
      SELECT
        a.idItemPreDocumento,
        a.servico,
        a.geraFinanceiro,
        a.quantidade,
        a.quantidadeConvertida,
        a.usarPrecoAVista,
        a.precoUnitarioBruto,
        a.acrescimoUnitarioComposicao,
        a.precoUnitario,
        a.precoUnitarioConvertido,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorBasePagamento,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorIRRF,
        a.valorINSS,
        a.valorRetPIS,
        a.valorRetCOFINS,
        a.valorRetCSLL,
        a.valorII,
        a.valorIOF,
        a.valorIPI,
        a.valorIPIDevolucao,
        a.valorPIS,
        a.valorPISST,
        a.valorCOFINS,
        a.valorCOFINSST,
        a.valorCreditoSimplesNacional,
        a.valorICMS,
        a.valorICMSST,
        a.valorImpostosSomaPagamento,
        a.valorImpostosDiminuiPagamento,
        a.valorLiquidoItem,
        a.valorDescontoCustoOpItem,
        a.valorDescontoCustoOpGeral,
        a.valorDescontoCustoOpTotal,
        a.valorAcrescimoCustoOpItem,
        a.valorAcrescimoCustoOpGeral,
        a.valorAcrescimoCustoOpTotal,
        a.precoCustoOperacao,
        a.valorCustoOperacao,
        a.precoCMV,
        a.valorCMV,
        a.quantidadeExtemporanea,
        a.acrescimoUnitarioExtemporaneo,
        a.valorAcrescimoExtempSubtotal,
        a.valorAcrescimoExtempItem,
        a.valorAcrescimoExtempGeral,
        a.valorAcrescimoExtempTotal,
        CASE WHEN p_modDoc_habilitaControleEntr = 0 OR EXISTS(SELECT 1 FROM MOPREDOCUMXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemPreDocumento = a.idItemPreDocumento AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END rateioFrete,
        CASE WHEN a.precoSugestaoAPrazo <> a.precoSugestaoAVista AND a.usarPrecoAVista = 1 THEN 1 ELSE 0 END aVista,
        CASE WHEN EXISTS(SELECT 1 FROM MOPREDOCUMXPROMOCOES promo WHERE promo.idItemPreDocumento = a.idItemPreDocumento) THEN 1 ELSE 0 END promocao,
        COALESCE((SELECT SUM(promo.valorDesconto) FROM MOPREDOCUMXPROMOCOES promo WHERE promo.idItemPreDocumento = a.idItemPreDocumento AND promo.cabecalhoItemPagamento ='C'),0) valorDescontoPromocaoGeral,
        COALESCE((SELECT SUM(promo.valorDesconto) FROM MOPREDOCUMXPROMOCOES promo WHERE promo.idItemPreDocumento = a.idItemPreDocumento AND promo.cabecalhoItemPagamento ='P'),0) valorDescontoPromocaoPagamento
      FROM MOPREDOCUMXITENS a
      WHERE a.preDocumento = p_cab_preDocumento
      AND a.cancelado = 0
      ORDER BY a.sequencia;
BEGIN
  r_cab_valorProdutos            := 0;
  r_cab_valorServicos            := 0;
  r_cab_valorBasePagamento       := 0;
  r_cab_valorAVistaMinimo        := 0;
  r_cab_valorFreteTotal          := 0;
  r_cab_valorSeguroTotal         := 0;
  r_cab_valorDescontoTotal       := 0;
  r_cab_valorOutrasDespesasTotal := 0;
  r_cab_valorAdicFreteMarinTotal := 0;
  r_cab_valorDespesasAduanTotal  := 0;
  r_cab_valorImpSomaPagamento    := 0;
  r_cab_valorImpDiminuiPagamento := 0;
  r_cab_valorLiquidoItem         := 0;
  r_cab_valorDescCustoOpTotal    := 0;
  r_cab_valorAcrescCustoOpTotal  := 0;
  r_cab_valorCustoOperacao       := 0;
  r_cab_valorCMV                 := 0;
  r_cab_valorAcrescExtempTotal   := 0;
  r_calcularImpostosItem         := 0;
  v_saldoRatFreteGeral           := p_cab_valorFreteGeral;
  v_saldoRatSeguroGeral          := p_cab_valorSeguroGeral;
  v_saldoRatDescontoGeral        := p_cab_valorDescontoGeral;
  v_saldoRatOutrasDespesasGeral  := p_cab_valorOutrasDespesasGeral;
  v_saldoRatAdicFreteMarinGeral  := p_cab_valorAdicFreteMarinGeral;
  v_saldoRatDespesasAduanGeral   := p_cab_valorDespesasAduanGeral;
  v_saldoRatDescontoPagamento    := p_cab_valorDescontoPagamento;
  v_saldoRatOutrasDespPagamento  := p_cab_valorOutrasDespPagamento;
  v_saldoRatJurosPagamento       := p_cab_valorJurosPagamento;
  v_saldoRatDescCustoOpGeral     := p_cab_valorDescCustoOpGeral;
  v_saldoRatAcrescCustoOpGeral   := p_cab_valorAcrescCustoOpGeral;
  v_saldoRatAcrescExtempGeral    := p_cab_valorAcrescExtempGeral;
  v_residuoFreteGeral            := 0;
  v_residuoSeguroGeral           := 0;
  v_residuoDescontoGeral         := 0;
  v_residuoOutrasDespesasGeral   := 0;
  v_residuoAdicFreteMarinGeral   := 0;
  v_residuoDespesasAduanGeral    := 0;
  v_residuoDescontoPagamento     := 0;
  v_residuoOutrasDespPagamento   := 0;
  v_residuoJurosPagamento        := 0;
  v_residuoDescCustoOpGeral      := 0;
  v_residuoAcrescCustoOpGeral    := 0;
  v_residuoAcrescExtempGeral     := 0;
  v_idItemPreDocUltimoItem       := 0;
  v_idItemPreDocRateioFrete      := 0;
  v_valorDescontoPromocaoGeral   := 0;
  v_valorDescontoPromocaoPagamen := 0;
  v_rateioDescontofiltrarSemProm := 0;
  v_rateioDescontofiltrarAPrazo  := 0;

  -- v_valorDescontoPromocaoGeral
  IF p_cab_valorDescontoGeral > 0 THEN
    SELECT COALESCE(SUM(promo.valorDesconto),0)
    INTO v_valorDescontoPromocaoGeral
    FROM MOPREDOCUMXITENS a
    JOIN MOPREDOCUMXPROMOCOES promo ON promo.idItemPreDocumento = a.idItemPreDocumento
    WHERE a.preDocumento = p_cab_preDocumento
    AND a.cancelado = 0
    AND promo.cabecalhoItemPagamento ='C';
  END IF;

  -- v_valorDescontoPromocaoPagamen
  IF p_cab_valorDescontoPagamento > 0 THEN
    SELECT COALESCE(SUM(promo.valorDesconto),0)
    INTO v_valorDescontoPromocaoPagamen
    FROM MOPREDOCUMXITENS a
    JOIN MOPREDOCUMXPROMOCOES promo ON promo.idItemPreDocumento = a.idItemPreDocumento
    WHERE a.preDocumento = p_cab_preDocumento
    AND a.cancelado = 0
    AND promo.cabecalhoItemPagamento ='P';
  END IF;

  -- v_rateioDescontofiltrarSemProm
  IF p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral OR p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
    SELECT
      CASE
        WHEN EXISTS(
          SELECT 1
          FROM MOPREDOCUMXITENS a
          WHERE a.preDocumento = p_cab_preDocumento
          AND a.cancelado = 0
          AND COALESCE((
            SELECT SUM(b.valorDesconto)
            FROM MOPREDOCUMXPROMOCOES b
            WHERE b.idItemPreDocumento = a.idItemPreDocumento
            AND b.cabecalhoItemPagamento IN ('C','P')),0) > (
            CASE
              WHEN p_modDoc_diminuiDescontoPrUnit = 1
                OR p_modDoc_somaAcrescimosPrUnit  = 1
                OR p_modDoc_somaFreteSeguroPrUnit = 1
              THEN a.valorProdutoServicoBruto
              ELSE a.valorProdutoServico
            END
            - a.valorDescontoItem
            + a.valorAcrescimoItem))
        THEN 0
        WHEN COALESCE ((
          SELECT SUM (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem)
          FROM MOPREDOCUMXITENS a
          JOIN MOPREDOCUMXPROMOCOES b ON b.idItemPreDocumento = a.idItemPreDocumento
          WHERE a.preDocumento = p_cab_preDocumento
          AND a.cancelado = 0),0) > (
            CASE
              WHEN p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral
              THEN p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral
              ELSE 0
            END +
            CASE
              WHEN p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen
              THEN p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen
              ELSE 0
            END)
          AND EXISTS (
            SELECT 1
            FROM MOPREDOCUMXITENS a
            WHERE a.preDocumento = p_cab_preDocumento
            AND a.cancelado = 0
            AND NOT (EXISTS(
              SELECT 1
              FROM MOPREDOCUMXPROMOCOES b
              WHERE b.idItemPreDocumento = a.idItemPreDocumento)))
        THEN 1
        ELSE 0
      END
    INTO v_rateioDescontofiltrarSemProm
    FROM DUAL;
  END IF;

  -- v_rateioDescontofiltrarAPrazo
  IF p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral OR p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
    SELECT
      CASE
        WHEN COALESCE ((
          SELECT SUM (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem)
          FROM MOPREDOCUMXITENS a
          WHERE a.preDocumento = p_cab_preDocumento
          AND a.cancelado = 0
          AND a.precoSugestaoAPrazo <> a.precoSugestaoAVista
          AND a.usarPrecoAVista = 1
          AND (v_rateioDescontofiltrarSemProm = 0
            OR NOT(EXISTS(
              SELECT 1
              FROM MOPREDOCUMXPROMOCOES promo
              WHERE promo.idItemPreDocumento = a.idItemPreDocumento)))),0) > (
            CASE
              WHEN p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral
              THEN p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral
              ELSE 0
            END +
            CASE
              WHEN p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen
              THEN p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen
              ELSE 0
            END)
          AND EXISTS (
            SELECT 1
            FROM MOPREDOCUMXITENS a
            WHERE a.preDocumento = p_cab_preDocumento
            AND a.cancelado = 0
            AND (a.precoSugestaoAPrazo = a.precoSugestaoAVista
              OR a.usarPrecoAVista = 0)
            AND (v_rateioDescontofiltrarSemProm = 0
              OR NOT(EXISTS(
                SELECT 1
                FROM MOPREDOCUMXPROMOCOES promo
                WHERE promo.idItemPreDocumento = a.idItemPreDocumento))))
        THEN 1
        ELSE 0
      END
    INTO v_rateioDescontofiltrarAPrazo
    FROM DUAL;
  END IF;

  -- Bases Rateio
  SELECT
    MAX(COALESCE((CASE WHEN p_modDoc_habilitaControleEntr = 0 OR EXISTS(SELECT 1 FROM MOPREDOCUMXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemPreDocumento = a.idItemPreDocumento AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END),0)),
    COALESCE(SUM(CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem),0),
    COALESCE(SUM(CASE WHEN p_modDoc_habilitaControleEntr = 0 OR EXISTS(SELECT 1 FROM MOPREDOCUMXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemPreDocumento = a.idItemPreDocumento AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 AND (p_modDoc_habilitaControleEntr = 0 OR EXISTS(SELECT 1 FROM MOPREDOCUMXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemPreDocumento = a.idItemPreDocumento AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1)) THEN CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR a.precoSugestaoAPrazo = a.precoSugestaoAVista OR a.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOPREDOCUMXPROMOCOES promo WHERE promo.idItemPreDocumento = a.idItemPreDocumento))) THEN CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR a.precoSugestaoAPrazo = a.precoSugestaoAVista OR a.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOPREDOCUMXPROMOCOES promo WHERE promo.idItemPreDocumento = a.idItemPreDocumento))) THEN CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 AND (v_rateioDescontofiltrarAPrazo = 0 OR a.precoSugestaoAPrazo = a.precoSugestaoAVista OR a.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOPREDOCUMXPROMOCOES promo WHERE promo.idItemPreDocumento = a.idItemPreDocumento))) THEN CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0)
  INTO
    v_rateioFretePorControleEntr,
    v_valorBaseRateio,
    v_valorBaseRateioFrete,
    v_valorBaseRateioFinanceiro,
    v_valorBaseRateioFinancFrete,
    v_valorBaseRateioDescontoGeral,
    v_valorBaseRateioPagamento,
    v_valorBaseRateioPagamFinanc,
    v_valorBaseRateioPagamDesconto,
    v_valorBaseRateioPagamFinDesc
  FROM MOPREDOCUMXITENS a
  WHERE a.preDocumento = p_cab_preDocumento
  AND a.cancelado = 0;

  -- Efetua rateio
  FOR item IN c_item LOOP
    v_idItemPreDocUltimoItem       := item.idItemPreDocumento;
    v_precoUnitario                := item.precoUnitario;
    v_precoUnitarioConvertido      := item.precoUnitarioConvertido;
    v_valorProdutoServico          := item.valorProdutoServico;
    v_valorBasePagamento           := item.valorBasePagamento;
    v_valorFreteTotal              := item.valorFreteTotal;
    v_valorSeguroTotal             := item.valorSeguroTotal;
    v_valorDescontoTotal           := item.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := item.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := item.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := item.valorDespesasAduaneirasTotal;
    v_valorImpSomaPagamento        := item.valorImpostosSomaPagamento;
    v_valorImpDiminuiPagamento     := item.valorImpostosDiminuiPagamento;
    v_valorLiquidoItem             := item.valorLiquidoItem;
    v_valorDescontoCustoOpTotal    := item.valorDescontoCustoOpTotal;
    v_valorAcrescimoCustoOpTotal   := item.valorAcrescimoCustoOpTotal;
    v_precoCustoOperacao           := item.precoCustoOperacao;
    v_valorCustoOperacao           := item.valorCustoOperacao;
    v_precoCMV                     := item.precoCMV;
    v_valorCMV                     := item.valorCMV;
    v_valorAcrescimoExtempSubtotal := item.valorAcrescimoExtempSubtotal;
    v_valorAcrescimoExtempTotal    := item.valorAcrescimoExtempTotal;

    IF CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END > 0 THEN
      IF item.geraFinanceiro = 1 AND (v_rateioFretePorControleEntr = 0 OR item.rateioFrete = 1) THEN
        v_idItemPreDocRateioFrete := item.idItemPreDocumento;
      END IF;
    ELSIF v_rateioFretePorControleEntr = 0 OR item.rateioFrete = 1 THEN
      v_idItemPreDocRateioFrete := item.idItemPreDocumento;
    END IF;

    -- v_valorFreteGeral
    v_auxNumber := v_residuoFreteGeral +
      CASE
        WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END > 0
        THEN 
          CASE
            WHEN item.geraFinanceiro = 1 AND (v_rateioFretePorControleEntr = 0 OR item.rateioFrete = 1)
            THEN
              CASE
                WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END = 0
                THEN 0
                ELSE p_cab_valorFreteGeral
                  * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
                  / CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END
              END
            ELSE 0
          END
        WHEN v_rateioFretePorControleEntr = 0 OR item.rateioFrete = 1
        THEN
          CASE
            WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFrete ELSE v_valorBaseRateio END = 0
            THEN 0
            ELSE p_cab_valorFreteGeral
              * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
              / CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFrete ELSE v_valorBaseRateio END
          END
        ELSE 0
      END;
    v_valorFreteGeral    := ROUND (v_auxNumber,2);
    v_residuoFreteGeral  := v_auxNumber - v_valorFreteGeral;
    v_saldoRatFreteGeral := v_saldoRatFreteGeral - v_valorFreteGeral;

    -- v_valorSeguroGeral
    v_auxNumber := v_residuoSeguroGeral +
      CASE
        WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END > 0
        THEN 
          CASE
            WHEN item.geraFinanceiro = 1 AND (v_rateioFretePorControleEntr = 0 OR item.rateioFrete = 1)
            THEN
              CASE
                WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END = 0
                THEN 0
                ELSE p_cab_valorSeguroGeral
                  * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
                  / CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END
              END
            ELSE 0
          END
        WHEN v_rateioFretePorControleEntr = 0 OR item.rateioFrete = 1
        THEN
          CASE
            WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFrete ELSE v_valorBaseRateio END = 0
            THEN 0
            ELSE p_cab_valorSeguroGeral
              * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
              / CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFrete ELSE v_valorBaseRateio END
          END
        ELSE 0
      END;
    v_valorSeguroGeral := ROUND (v_auxNumber,2);
    v_residuoSeguroGeral := v_auxNumber - v_valorSeguroGeral;
    v_saldoRatSeguroGeral := v_saldoRatSeguroGeral - v_valorSeguroGeral;

    -- v_valorAdicFreteMarinMerGeral
    v_auxNumber := v_residuoAdicFreteMarinGeral +
      CASE
        WHEN v_valorBaseRateioFinanceiro > 0 AND item.geraFinanceiro = 1
        THEN p_cab_valorAdicFreteMarinGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
        WHEN v_valorBaseRateioFinanceiro <= 0 AND v_valorBaseRateio > 0
        THEN p_cab_valorAdicFreteMarinGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateio
        ELSE 0
      END;
    v_valorAdicFreteMarinMerGeral := ROUND (v_auxNumber,2);
    v_residuoAdicFreteMarinGeral := v_auxNumber - v_valorAdicFreteMarinMerGeral;
    v_saldoRatAdicFreteMarinGeral := v_saldoRatAdicFreteMarinGeral - v_valorAdicFreteMarinMerGeral;

    -- v_valorDespesasAduaneirasGeral
    v_auxNumber := v_residuoDespesasAduanGeral +
      CASE
        WHEN v_valorBaseRateioFinanceiro > 0 AND item.geraFinanceiro = 1
        THEN p_cab_valorDespesasAduanGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
        WHEN v_valorBaseRateioFinanceiro <= 0 AND v_valorBaseRateio > 0
        THEN p_cab_valorDespesasAduanGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateio
        ELSE 0
      END;
    v_valorDespesasAduaneirasGeral := ROUND (v_auxNumber,2);
    v_residuoDespesasAduanGeral := v_auxNumber - v_valorDespesasAduaneirasGeral;
    v_saldoRatDespesasAduanGeral := v_saldoRatDespesasAduanGeral - v_valorDespesasAduaneirasGeral;

    -- v_residuoDescCustoOpGeral
    v_auxNumber := v_residuoDescCustoOpGeral +
      CASE
        WHEN v_valorBaseRateioFinanceiro > 0 AND item.geraFinanceiro = 1
        THEN p_cab_valorDescCustoOpGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
        WHEN v_valorBaseRateioFinanceiro <= 0 AND v_valorBaseRateio > 0
        THEN p_cab_valorDescCustoOpGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateio
        ELSE 0
      END;
    v_valorDescontoCustoOpGeral := ROUND (v_auxNumber,2);
    v_residuoDescCustoOpGeral := v_auxNumber - v_valorDescontoCustoOpGeral;
    v_saldoRatDescCustoOpGeral := v_saldoRatDescCustoOpGeral - v_valorDescontoCustoOpGeral;

    -- v_valorAcrescimoCustoOpGeral
    v_auxNumber := v_residuoAcrescCustoOpGeral +
      CASE
        WHEN v_valorBaseRateioFinanceiro > 0 AND item.geraFinanceiro = 1
        THEN p_cab_valorAcrescCustoOpGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
        WHEN v_valorBaseRateioFinanceiro <= 0 AND v_valorBaseRateio > 0
        THEN p_cab_valorAcrescCustoOpGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateio
        ELSE 0
      END;
    v_valorAcrescimoCustoOpGeral := ROUND (v_auxNumber,2);
    v_residuoAcrescCustoOpGeral := v_auxNumber - v_valorAcrescimoCustoOpGeral;
    v_saldoRatAcrescCustoOpGeral := v_saldoRatAcrescCustoOpGeral - v_valorAcrescimoCustoOpGeral;

    -- v_valorAcrescimoExtempGeral
    v_auxNumber := v_residuoAcrescExtempGeral +
      CASE
        WHEN v_valorBaseRateioFinanceiro > 0 AND item.geraFinanceiro = 1
        THEN p_cab_valorAcrescExtempGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
        WHEN v_valorBaseRateioFinanceiro <= 0 AND v_valorBaseRateio > 0
        THEN p_cab_valorAcrescExtempGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateio
        ELSE 0
      END;
    v_valorAcrescimoExtempGeral := ROUND (v_auxNumber,2);
    v_residuoAcrescExtempGeral := v_auxNumber - v_valorAcrescimoExtempGeral;
    v_saldoRatAcrescExtempGeral := v_saldoRatAcrescExtempGeral - v_valorAcrescimoExtempGeral;

    -- v_valorOutrasDespesasGeral
    v_auxNumber := v_residuoOutrasDespesasGeral +
      CASE
        WHEN v_valorBaseRateioFinanceiro > 0 AND item.geraFinanceiro = 1
        THEN p_cab_valorOutrasDespesasGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
        WHEN v_valorBaseRateioFinanceiro <= 0 AND v_valorBaseRateio > 0
        THEN p_cab_valorOutrasDespesasGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateio
        ELSE 0
      END;
    v_valorOutrasDespesasGeral := ROUND (v_auxNumber,2);
    v_residuoOutrasDespesasGeral := v_auxNumber - v_valorOutrasDespesasGeral;
    v_saldoRatOutrasDespesasGeral := v_saldoRatOutrasDespesasGeral - v_valorOutrasDespesasGeral;

    -- v_valorOutrasDespesasPagamento
    v_auxNumber := v_residuoOutrasDespPagamento +
      CASE
        WHEN v_valorBaseRateioPagamFinanc > 0 AND item.geraFinanceiro = 1
        THEN p_cab_valorOutrasDespPagamento
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioPagamFinanc
        WHEN v_valorBaseRateioPagamFinanc <= 0 AND v_valorBaseRateioPagamento > 0
        THEN p_cab_valorOutrasDespPagamento
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioPagamento
        ELSE 0
      END;
    v_valorOutrasDespesasPagamento := ROUND (v_auxNumber,2);
    v_residuoOutrasDespPagamento := v_auxNumber - v_valorOutrasDespesasPagamento;
    v_saldoRatOutrasDespPagamento := v_saldoRatOutrasDespPagamento - v_valorOutrasDespesasPagamento;

    -- v_valorJurosPagamento
    v_auxNumber := v_residuoJurosPagamento +
      CASE
        WHEN v_valorBaseRateioPagamFinanc > 0 AND item.geraFinanceiro = 1
        THEN p_cab_valorJurosPagamento
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioPagamFinanc
        WHEN v_valorBaseRateioPagamFinanc <= 0 AND v_valorBaseRateioPagamento > 0
        THEN p_cab_valorJurosPagamento
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioPagamento
        ELSE 0
      END;
    v_valorJurosPagamento := ROUND (v_auxNumber,2);
    v_residuoJurosPagamento := v_auxNumber - v_valorJurosPagamento;
    v_saldoRatJurosPagamento := v_saldoRatJurosPagamento - v_valorJurosPagamento;

    -- v_valorDescontoGeral
    v_auxNumber := v_residuoDescontoGeral +
      CASE
        WHEN v_valorBaseRateioDescontoGeral = 0
          OR v_rateioDescontofiltrarSemProm = 1 AND p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral <= 0
          OR v_rateioDescontofiltrarAPrazo  = 1 AND item.aVista = 1
          OR v_rateioDescontofiltrarSemProm = 1 AND item.promocao = 1
        THEN 0
        ELSE (p_cab_valorDescontoGeral - CASE WHEN v_rateioDescontofiltrarSemProm = 1 THEN v_valorDescontoPromocaoGeral ELSE 0 END)
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioDescontoGeral
      END +
      CASE
        WHEN p_cab_valorDescontoGeral = 0 OR v_valorDescontoPromocaoGeral = 0 OR item.valorDescontoPromocaoGeral = 0 OR v_rateioDescontofiltrarSemProm = 0
        THEN 0
        WHEN p_cab_valorDescontoGeral < v_valorDescontoPromocaoGeral
        THEN item.valorDescontoPromocaoGeral * p_cab_valorDescontoGeral / v_valorDescontoPromocaoGeral
        ELSE item.valorDescontoPromocaoGeral
      END;
    IF ROUND (v_auxNumber,2) >= v_saldoRatDescontoGeral THEN
      v_valorDescontoGeral := v_saldoRatDescontoGeral;
      v_residuoDescontoGeral := 0;
    ELSE
      v_valorDescontoGeral := ROUND (v_auxNumber,2);
      v_residuoDescontoGeral := v_auxNumber - v_valorDescontoGeral;
    END IF;
    v_saldoRatDescontoGeral := v_saldoRatDescontoGeral - v_valorDescontoGeral;

    -- v_valorDescontoPagamento
    v_auxNumber := v_residuoDescontoPagamento +
      CASE
        WHEN v_valorBaseRateioPagamFinDesc > 0 AND item.geraFinanceiro = 1
        THEN
          CASE
            WHEN p_cab_valorDescontoPagamento = 0
              OR v_rateioDescontofiltrarSemProm = 1 AND p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen <= 0
              OR v_rateioDescontofiltrarAPrazo  = 1 AND item.aVista = 1
              OR v_rateioDescontofiltrarSemProm = 1 AND item.promocao = 1
            THEN 0
            ELSE (p_cab_valorDescontoPagamento - CASE WHEN v_rateioDescontofiltrarSemProm = 1 THEN v_valorDescontoPromocaoPagamen ELSE 0 END)
              * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
              / v_valorBaseRateioPagamFinDesc
          END
        WHEN v_valorBaseRateioPagamFinDesc <= 0 AND v_valorBaseRateioPagamDesconto > 0
        THEN
          CASE
            WHEN p_cab_valorDescontoPagamento = 0
              OR v_rateioDescontofiltrarSemProm = 1 AND p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen <= 0
              OR v_rateioDescontofiltrarAPrazo  = 1 AND item.aVista = 1
              OR v_rateioDescontofiltrarSemProm = 1 AND item.promocao = 1
            THEN 0
            ELSE (p_cab_valorDescontoPagamento - CASE WHEN v_rateioDescontofiltrarSemProm = 1 THEN v_valorDescontoPromocaoPagamen ELSE 0 END)
              * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
              / v_valorBaseRateioPagamDesconto
          END
        ELSE 0
      END +
      CASE
        WHEN p_cab_valorDescontoPagamento = 0 OR v_valorDescontoPromocaoPagamen = 0 OR item.valorDescontoPromocaoPagamento = 0 OR v_rateioDescontofiltrarSemProm = 0
        THEN 0
        WHEN p_cab_valorDescontoPagamento < v_valorDescontoPromocaoPagamen
        THEN item.valorDescontoPromocaoPagamento * p_cab_valorDescontoPagamento / v_valorDescontoPromocaoPagamen
        ELSE item.valorDescontoPromocaoPagamento
      END;
    IF ROUND (v_auxNumber,2) >= v_saldoRatDescontoPagamento THEN
      v_valorDescontoPagamento := v_saldoRatDescontoPagamento;
      v_residuoDescontoPagamento := 0;
    ELSE
      v_valorDescontoPagamento := ROUND (v_auxNumber,2);
      v_residuoDescontoPagamento := v_auxNumber - v_valorDescontoPagamento;
    END IF;
    v_saldoRatDescontoPagamento := v_saldoRatDescontoPagamento - v_valorDescontoPagamento;

    -- Recalcula Valores
    ADD_CALCULA_TOTAIS_ITEM(
      p_cab_tipoPagamentoFrete,
      p_modDoc_diminuiDescontoPrUnit,
      p_modDoc_somaAcrescimosPrUnit,
      p_modDoc_somaFreteSeguroPrUnit,
      item.quantidade,
      item.quantidadeConvertida,
      item.precoUnitarioBruto,
      item.acrescimoUnitarioComposicao,
      item.precoUnitario,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      v_valorFreteGeral,
      v_valorSeguroGeral,
      v_valorDescontoGeral,
      v_valorOutrasDespesasGeral,
      v_valorAdicFreteMarinMerGeral,
      v_valorDespesasAduaneirasGeral,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      item.quantidadeExtemporanea,
      item.acrescimoUnitarioExtemporaneo,
      item.valorAcrescimoExtempItem,
      v_valorAcrescimoExtempGeral,
      /* Retornos */
      v_precoUnitario,
      v_precoUnitarioConvertido,
      v_valorProdutoServico,
      v_auxNumber,
      v_auxNumber,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      v_valorAcrescimoExtempSubtotal,
      v_valorAcrescimoExtempTotal);
    IF p_cab_impostosEditados = 0 
        OR v_valorProdutoServico <> item.valorProdutoServico
        OR CASE WHEN p_cab_tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorFreteTotal END
        <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE p_cab_tipoPagamentoFrete END = 'V' THEN 0 ELSE item.valorFreteTotal END
        OR CASE WHEN p_cab_tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorSeguroTotal END
        <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE p_cab_tipoPagamentoFrete END = 'V' THEN 0 ELSE item.valorSeguroTotal END
        OR v_valorDescontoTotal <> item.valorDescontoTotal
        OR v_valorOutrasDespesasTotal <> item.valorOutrasDespesasTotal
        OR v_valorAdicFreteMarinMerTotal <> item.valorAdicFreteMarinhaMerTotal
        OR v_valorDespesasAduaneirasTotal <> item.valorDespesasAduaneirasTotal
        OR v_precoUnitario <> item.precoUnitario
        OR v_valorProdutoServico <> item.valorProdutoServico
    THEN
      r_calcularImpostosItem := 1;
    END IF;
    ADD_CALCULA_VALOR_LIQUIDO (
      0,
      p_cab_tipoPagamentoFrete,
      item.geraFinanceiro,
      v_valorProdutoServico,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      item.valorIRRF,
      item.valorINSS,
      item.valorRetPIS,
      item.valorRetCOFINS,
      item.valorRetCSLL,
      item.valorII,
      item.valorIOF,
      item.valorIPI,
      item.valorIPIDevolucao,
      item.valorICMSST,
      0,
      0,
      v_valorAcrescimoExtempTotal,
      /* Retornos */
      v_valorBasePagamento,
      v_valorImpSomaPagamento,
      v_valorImpDiminuiPagamento,
      v_valorLiquidoItem);
    ADD_CALCULA_CUSTO_CMV (
      p_cab_modeloDocumento,
      p_cab_atualizaCustoMedio,
      0,
      item.quantidade,
      item.valorII,
      item.valorIOF,
      item.valorIPI,
      item.valorIPIDevolucao,
      item.valorPIS,
      item.valorPISST,
      item.valorCOFINS,
      item.valorCOFINSST,
      item.valorCreditoSimplesNacional,
      item.valorICMS,
      item.valorICMSST,
      0,
      v_valorLiquidoItem,
      item.valorDescontoCustoOpItem,
      v_valorDescontoCustoOpGeral,
      item.valorAcrescimoCustoOpItem,
      v_valorAcrescimoCustoOpGeral,
      v_valorAcrescimoExtempTotal,
      /* Retornos */
      v_valorDescontoCustoOpTotal,
      v_valorAcrescimoCustoOpTotal,
      v_precoCustoOperacao,
      v_valorCustoOperacao,
      v_precoCMV,
      v_valorCMV);
    -- Atualiza Item
    UPDATE MOPREDOCUMXITENS SET
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorFreteGeral               = v_valorFreteGeral,
      valorSeguroGeral              = v_valorSeguroGeral,
      valorDescontoGeral            = v_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
      valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
      valorBasePagamento            = v_valorBasePagamento,
      valorDescontoPagamento        = v_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
      valorJurosPagamento           = v_valorJurosPagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      valorImpostosSomaPagamento    = v_valorImpSomaPagamento,
      valorImpostosDiminuiPagamento = v_valorImpDiminuiPagamento,
      valorLiquidoItem              = v_valorLiquidoItem,
      valorDescontoCustoOpGeral     = v_valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpGeral    = v_valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
      precoCustoOperacao            = v_precoCustoOperacao,
      valorCustoOperacao            = v_valorCustoOperacao,
      precoCMV                      = v_precoCMV,
      valorCMV                      = v_valorCMV,
      valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempGeral     = v_valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
    WHERE idItemPreDocumento        = item.idItemPreDocumento;
    IF item.servico = 1 THEN
      r_cab_valorServicos            := r_cab_valorServicos + v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos            := r_cab_valorProdutos + v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_valorBasePagamento;
    IF item.usarPrecoAVista = 1 AND item.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
    r_cab_valorImpSomaPagamento    := r_cab_valorImpSomaPagamento + v_valorImpSomaPagamento;
    r_cab_valorImpDiminuiPagamento := r_cab_valorImpDiminuiPagamento + v_valorImpDiminuiPagamento;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
    r_cab_valorDescCustoOpTotal    := r_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
    r_cab_valorAcrescCustoOpTotal  := r_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
    r_cab_valorCustoOperacao       := r_cab_valorCustoOperacao + v_valorCustoOperacao;
    r_cab_valorCMV                 := r_cab_valorCMV + v_valorCMV;
    r_cab_valorAcrescExtempTotal   := r_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
  END LOOP;
  IF v_idItemPreDocUltimoItem <> 0 AND (v_saldoRatDescontoGeral <> 0 OR v_saldoRatOutrasDespesasGeral <> 0 OR v_saldoRatDescontoPagamento <> 0 OR v_saldoRatOutrasDespPagamento <> 0 OR v_saldoRatJurosPagamento <> 0 OR v_saldoRatFreteGeral <> 0 OR v_saldoRatSeguroGeral <> 0 OR v_saldoRatAdicFreteMarinGeral <> 0 OR v_saldoRatDespesasAduanGeral <> 0) THEN
    ADD_PRE_DOC_CALC_IMP_RESIDUO (
      p_troca_tipoPagamentoFrete,
      p_a_cab_tipoPagamentoFrete,
      p_cab_modeloDocumento,
      p_cab_entradaSaida,
      p_cab_devolucaoAnulacaoRetorno,
      p_cab_atualizaCustoMedio,
      p_cab_tipoPagamentoFrete,
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      r_cab_valorDescontoTotal,
      r_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      p_cab_impostosEditados,
      r_cab_valorImpSomaPagamento,
      r_cab_valorImpDiminuiPagamento,
      r_cab_valorLiquidoItem,
      r_cab_valorDescCustoOpTotal,
      r_cab_valorAcrescCustoOpTotal,
      r_cab_valorCustoOperacao,
      r_cab_valorCMV,
      r_cab_valorAcrescExtempTotal,
      p_modDoc_diminuiDescontoPrUnit,
      p_modDoc_somaAcrescimosPrUnit,
      p_modDoc_somaFreteSeguroPrUnit,
      CASE WHEN v_idItemPreDocRateioFrete = 0 THEN v_idItemPreDocUltimoItem ELSE v_idItemPreDocRateioFrete END,
      v_saldoRatFreteGeral,
      v_saldoRatSeguroGeral,
      v_saldoRatDescontoGeral,
      v_saldoRatOutrasDespesasGeral,
      v_saldoRatAdicFreteMarinGeral,
      v_saldoRatDespesasAduanGeral,
      v_saldoRatDescontoPagamento,
      v_saldoRatOutrasDespPagamento,
      v_saldoRatJurosPagamento,
      v_saldoRatDescCustoOpGeral,
      v_saldoRatAcrescCustoOpGeral,
      v_saldoRatAcrescExtempGeral,
      r_calcularImpostosItem,
      /* Retornos */
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      r_cab_valorDescontoTotal,
      r_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      r_cab_valorImpSomaPagamento,
      r_cab_valorImpDiminuiPagamento,
      r_cab_valorLiquidoItem,
      r_cab_valorDescCustoOpTotal,
      r_cab_valorAcrescCustoOpTotal,
      r_cab_valorCustoOperacao,
      r_cab_valorCMV,
      r_cab_valorAcrescExtempTotal,
      r_calcularImpostosItem);
  END IF;
END ADD_PRE_DOC_CALC_IMP_RATEIO;

/

create or replace PROCEDURE ADD_ORCAMENTO_CALC_IMP_RATEIO (
    p_cab_orcamento                IN NUMBER,
    p_troca_tipoPagamentoFrete     IN NUMBER,
    p_a_cab_tipoPagamentoFrete     IN CHAR,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_tipoPagamentoFrete       IN CHAR,
    p_cab_valorFreteGeral          IN NUMBER,
    p_cab_valorSeguroGeral         IN NUMBER,
    p_cab_valorDescontoGeral       IN NUMBER,
    p_cab_valorOutrasDespesasGeral IN NUMBER,
    p_cab_valorAdicFreteMarinGeral IN NUMBER,
    p_cab_valorDespesasAduanGeral  IN NUMBER,
    p_cab_valorDescontoPagamento   IN NUMBER,
    p_cab_valorOutrasDespPagamento IN NUMBER,
    p_cab_valorJurosPagamento      IN NUMBER,
    p_cab_impostosEditados         IN NUMBER,
    p_modDoc_diminuiDescontoPrUnit IN NUMBER,
    p_modDoc_somaAcrescimosPrUnit  IN NUMBER,
    p_modDoc_somaFreteSeguroPrUnit IN NUMBER,
    p_modDoc_habilitaControleEntr  IN NUMBER,
    /* Retornos */
    r_cab_valorProdutos            OUT NUMBER,
    r_cab_valorServicos            OUT NUMBER,
    r_cab_valorBasePagamento       OUT NUMBER,
    r_cab_valorAVistaMinimo        OUT NUMBER,
    r_cab_valorFreteTotal          OUT NUMBER,
    r_cab_valorSeguroTotal         OUT NUMBER,
    r_cab_valorDescontoTotal       OUT NUMBER,
    r_cab_valorOutrasDespesasTotal OUT NUMBER,
    r_cab_valorAdicFreteMarinTotal OUT NUMBER,
    r_cab_valorDespesasAduanTotal  OUT NUMBER,
    r_cab_valorImpSomaPagamento    OUT NUMBER,
    r_cab_valorImpDiminuiPagamento OUT NUMBER,
    r_cab_valorLiquidoItem         OUT NUMBER,
    r_calcularImpostosItem         OUT NUMBER)
IS
    v_auxNumber                    NUMBER;
    v_valorDescontoPromocaoGeral   NUMBER;
    v_valorDescontoPromocaoPagamen NUMBER;
    v_rateioDescontofiltrarSemProm NUMBER;
    v_rateioDescontofiltrarAPrazo  NUMBER;
    v_rateioFretePorControleEntr   NUMBER;
    v_valorBaseRateio              NUMBER;
    v_valorBaseRateioFrete         NUMBER;
    v_valorBaseRateioFinanceiro    NUMBER;
    v_valorBaseRateioFinancFrete   NUMBER;
    v_valorBaseRateioDescontoGeral NUMBER;
    v_valorBaseRateioPagamento     NUMBER;
    v_valorBaseRateioPagamFinanc   NUMBER;
    v_valorBaseRateioPagamDesconto NUMBER;
    v_valorBaseRateioPagamFinDesc  NUMBER;
    v_saldoRatFreteGeral           NUMBER;
    v_saldoRatSeguroGeral          NUMBER;
    v_saldoRatDescontoGeral        NUMBER;
    v_saldoRatOutrasDespesasGeral  NUMBER;
    v_saldoRatAdicFreteMarinGeral  NUMBER;
    v_saldoRatDespesasAduanGeral   NUMBER;
    v_saldoRatDescontoPagamento    NUMBER;
    v_saldoRatOutrasDespPagamento  NUMBER;
    v_saldoRatJurosPagamento       NUMBER;
    v_residuoFreteGeral            NUMBER;
    v_residuoSeguroGeral           NUMBER;
    v_residuoDescontoGeral         NUMBER;
    v_residuoOutrasDespesasGeral   NUMBER;
    v_residuoAdicFreteMarinGeral   NUMBER;
    v_residuoDespesasAduanGeral    NUMBER;
    v_residuoDescontoPagamento     NUMBER;
    v_residuoOutrasDespPagamento   NUMBER;
    v_residuoJurosPagamento        NUMBER;
    v_idItemOrcamentoUltimoItem    NUMBER;
    v_idItemOrcamentoRateioFrete   NUMBER;
    v_precoUnitario                NUMBER;
    v_precoUnitarioConvertido      NUMBER;
    v_valorProdutoServico          NUMBER;
    v_valorFreteGeral              NUMBER;
    v_valorSeguroGeral             NUMBER;
    v_valorDescontoGeral           NUMBER;
    v_valorOutrasDespesasGeral     NUMBER;
    v_valorAdicFreteMarinMerGeral  NUMBER;
    v_valorDespesasAduaneirasGeral NUMBER;
    v_valorBasePagamento           NUMBER;
    v_valorDescontoPagamento       NUMBER;
    v_valorOutrasDespesasPagamento NUMBER;
    v_valorJurosPagamento          NUMBER;
    v_valorFreteTotal              NUMBER;
    v_valorSeguroTotal             NUMBER;
    v_valorDescontoTotal           NUMBER;
    v_valorOutrasDespesasTotal     NUMBER;
    v_valorAdicFreteMarinMerTotal  NUMBER;
    v_valorDespesasAduaneirasTotal NUMBER;
    v_valorImpSomaPagamento        NUMBER;
    v_valorImpDiminuiPagamento     NUMBER;
    v_valorLiquidoItem             NUMBER;
    CURSOR c_item IS
      SELECT
        a.idItemOrcamento,
        a.servico,
        a.geraFinanceiro,
        a.quantidade,
        a.quantidadeConvertida,
        a.usarPrecoAVista,
        a.precoUnitarioBruto,
        a.acrescimoUnitarioComposicao,
        a.precoUnitario,
        a.precoUnitarioConvertido,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorBasePagamento,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorIRRF,
        a.valorINSS,
        a.valorRetPIS,
        a.valorRetCOFINS,
        a.valorRetCSLL,
        a.valorII,
        a.valorIOF,
        a.valorIPI,
        a.valorPIS,
        a.valorPISST,
        a.valorCOFINS,
        a.valorCOFINSST,
        a.valorCreditoSimplesNacional,
        a.valorICMS,
        a.valorICMSST,
        a.valorImpostosSomaPagamento,
        a.valorImpostosDiminuiPagamento,
        a.valorLiquidoItem,
        CASE WHEN p_modDoc_habilitaControleEntr = 0 OR contr.habilitaFrete = 1 THEN 1 ELSE 0 END rateioFrete,
        CASE WHEN a.precoSugestaoAPrazo <> a.precoSugestaoAVista AND a.usarPrecoAVista = 1 THEN 1 ELSE 0 END aVista,
        CASE WHEN EXISTS(SELECT 1 FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = a.idItemOrcamento) THEN 1 ELSE 0 END promocao,
        COALESCE((SELECT SUM(promo.valorDesconto) FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = a.idItemOrcamento AND promo.cabecalhoItemPagamento ='C'),0) valorDescontoPromocaoGeral,
        COALESCE((SELECT SUM(promo.valorDesconto) FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = a.idItemOrcamento AND promo.cabecalhoItemPagamento ='P'),0) valorDescontoPromocaoPagamento
      FROM MOORCAMENTOXITENS a
      JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = a.controleEntrega
      WHERE a.orcamento = p_cab_orcamento
      AND a.cancelado = 0
      ORDER BY a.sequencia;
BEGIN
  v_idItemOrcamentoUltimoItem    := 0;
  v_idItemOrcamentoRateioFrete   := 0;
  r_cab_valorProdutos            := 0;
  r_cab_valorServicos            := 0;
  r_cab_valorBasePagamento       := 0;
  r_cab_valorAVistaMinimo        := 0;
  r_cab_valorFreteTotal          := 0;
  r_cab_valorSeguroTotal         := 0;
  r_cab_valorDescontoTotal       := 0;
  r_cab_valorOutrasDespesasTotal := 0;
  r_cab_valorAdicFreteMarinTotal := 0;
  r_cab_valorDespesasAduanTotal  := 0;
  r_cab_valorImpSomaPagamento    := 0;
  r_cab_valorImpDiminuiPagamento := 0;
  r_cab_valorLiquidoItem         := 0;
  r_calcularImpostosItem         := 0;
  v_saldoRatFreteGeral           := p_cab_valorFreteGeral;
  v_saldoRatSeguroGeral          := p_cab_valorSeguroGeral;
  v_saldoRatDescontoGeral        := p_cab_valorDescontoGeral;
  v_saldoRatOutrasDespesasGeral  := p_cab_valorOutrasDespesasGeral;
  v_saldoRatAdicFreteMarinGeral  := p_cab_valorAdicFreteMarinGeral;
  v_saldoRatDespesasAduanGeral   := p_cab_valorDespesasAduanGeral;
  v_saldoRatDescontoPagamento    := p_cab_valorDescontoPagamento;
  v_saldoRatOutrasDespPagamento  := p_cab_valorOutrasDespPagamento;
  v_saldoRatJurosPagamento       := p_cab_valorJurosPagamento;
  v_residuoFreteGeral            := 0;
  v_residuoSeguroGeral           := 0;
  v_residuoDescontoGeral         := 0;
  v_residuoOutrasDespesasGeral   := 0;
  v_residuoAdicFreteMarinGeral   := 0;
  v_residuoDespesasAduanGeral    := 0;
  v_residuoDescontoPagamento     := 0;
  v_residuoOutrasDespPagamento   := 0;
  v_residuoJurosPagamento        := 0;
  v_valorDescontoPromocaoGeral   := 0;
  v_valorDescontoPromocaoPagamen := 0;
  v_rateioDescontofiltrarSemProm := 0;
  v_rateioDescontofiltrarAPrazo  := 0;

  -- v_valorDescontoPromocaoGeral
  IF p_cab_valorDescontoGeral > 0 THEN
    SELECT COALESCE(SUM(promo.valorDesconto),0)
    INTO v_valorDescontoPromocaoGeral
    FROM MOORCAMENTOXITENS a
    JOIN MOORCAMENTOXPROMOCOES promo ON promo.idItemOrcamento = a.idItemOrcamento
    WHERE a.orcamento = p_cab_orcamento
    AND a.cancelado = 0
    AND promo.cabecalhoItemPagamento ='C';
  END IF;

  -- v_valorDescontoPromocaoPagamen
  IF p_cab_valorDescontoPagamento > 0 THEN
    SELECT COALESCE(SUM(promo.valorDesconto),0)
    INTO v_valorDescontoPromocaoPagamen
    FROM MOORCAMENTOXITENS a
    JOIN MOORCAMENTOXPROMOCOES promo ON promo.idItemOrcamento = a.idItemOrcamento
    WHERE a.orcamento = p_cab_orcamento
    AND a.cancelado = 0
    AND promo.cabecalhoItemPagamento ='P';
  END IF;

  -- v_rateioDescontofiltrarSemProm
  IF p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral OR p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
    SELECT
      CASE
        WHEN EXISTS(
          SELECT 1
          FROM MOORCAMENTOXITENS a
          WHERE a.orcamento = p_cab_orcamento
          AND a.cancelado = 0
          AND COALESCE((
            SELECT SUM(b.valorDesconto)
            FROM MOORCAMENTOXPROMOCOES b
            WHERE b.idItemOrcamento = a.idItemOrcamento
            AND b.cabecalhoItemPagamento IN ('C','P')),0) > (
            CASE
              WHEN p_modDoc_diminuiDescontoPrUnit = 1
                OR p_modDoc_somaAcrescimosPrUnit  = 1
                OR p_modDoc_somaFreteSeguroPrUnit = 1
              THEN a.valorProdutoServicoBruto
              ELSE a.valorProdutoServico
            END
            - a.valorDescontoItem
            + a.valorAcrescimoItem))
        THEN 0
        WHEN COALESCE ((
          SELECT SUM (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem)
          FROM MOORCAMENTOXITENS a
          JOIN MOORCAMENTOXPROMOCOES b ON b.idItemOrcamento = a.idItemOrcamento
          WHERE a.orcamento = p_cab_orcamento
          AND a.cancelado = 0),0) > (
            CASE
              WHEN p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral
              THEN p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral
              ELSE 0
            END +
            CASE
              WHEN p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen
              THEN p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen
              ELSE 0
            END)
          AND EXISTS (
            SELECT 1
            FROM MOORCAMENTOXITENS a
            WHERE a.orcamento = p_cab_orcamento
            AND a.cancelado = 0
            AND NOT (EXISTS(
              SELECT 1
              FROM MOORCAMENTOXPROMOCOES b
              WHERE b.idItemOrcamento = a.idItemOrcamento)))
        THEN 1
        ELSE 0
      END
    INTO v_rateioDescontofiltrarSemProm
    FROM DUAL;
  END IF;

  -- v_rateioDescontofiltrarAPrazo
  IF p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral OR p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
    SELECT
      CASE
        WHEN COALESCE ((
          SELECT SUM (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem)
          FROM MOORCAMENTOXITENS a
          WHERE a.orcamento = p_cab_orcamento
          AND a.cancelado = 0
          AND a.precoSugestaoAPrazo <> a.precoSugestaoAVista
          AND a.usarPrecoAVista = 1
          AND (v_rateioDescontofiltrarSemProm = 0
            OR NOT(EXISTS(
              SELECT 1
              FROM MOORCAMENTOXPROMOCOES promo
              WHERE promo.idItemOrcamento = a.idItemOrcamento)))),0) > (
            CASE
              WHEN p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral
              THEN p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral
              ELSE 0
            END +
            CASE
              WHEN p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen
              THEN p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen
              ELSE 0
            END)
          AND EXISTS (
            SELECT 1
            FROM MOORCAMENTOXITENS a
            WHERE a.orcamento = p_cab_orcamento
            AND a.cancelado = 0
            AND (a.precoSugestaoAPrazo = a.precoSugestaoAVista
              OR a.usarPrecoAVista = 0)
            AND (v_rateioDescontofiltrarSemProm = 0
              OR NOT(EXISTS(
                SELECT 1
                FROM MOORCAMENTOXPROMOCOES promo
                WHERE promo.idItemOrcamento = a.idItemOrcamento))))
        THEN 1
        ELSE 0
      END
    INTO v_rateioDescontofiltrarAPrazo
    FROM DUAL;
  END IF;

  -- Bases Rateio
  SELECT
    COALESCE(MAX(CASE WHEN p_modDoc_habilitaControleEntr = 0 OR a.controleEntrega > 0 AND contr.habilitaFrete = 1 THEN 1 ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem),0),
    COALESCE(SUM(CASE WHEN p_modDoc_habilitaControleEntr = 0 OR a.controleEntrega > 0 AND contr.habilitaFrete = 1 THEN CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 AND (p_modDoc_habilitaControleEntr = 0 OR a.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR a.precoSugestaoAPrazo = a.precoSugestaoAVista OR a.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = a.idItemOrcamento))) THEN CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR a.precoSugestaoAPrazo = a.precoSugestaoAVista OR a.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = a.idItemOrcamento))) THEN CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 AND (v_rateioDescontofiltrarAPrazo = 0 OR a.precoSugestaoAPrazo = a.precoSugestaoAVista OR a.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = a.idItemOrcamento))) THEN CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0)
  INTO
    v_rateioFretePorControleEntr,
    v_valorBaseRateio,
    v_valorBaseRateioFrete,
    v_valorBaseRateioFinanceiro,
    v_valorBaseRateioFinancFrete,
    v_valorBaseRateioDescontoGeral,
    v_valorBaseRateioPagamento,
    v_valorBaseRateioPagamFinanc,
    v_valorBaseRateioPagamDesconto,
    v_valorBaseRateioPagamFinDesc
  FROM MOORCAMENTOXITENS a
  JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = a.controleEntrega
  WHERE a.orcamento = p_cab_orcamento
  AND a.cancelado = 0;

  -- Efetua rateio
  FOR item IN c_item LOOP
    v_idItemOrcamentoUltimoItem    := item.idItemOrcamento;
    v_precoUnitario                := item.precoUnitario;
    v_precoUnitarioConvertido      := item.precoUnitarioConvertido;
    v_valorProdutoServico          := item.valorProdutoServico;
    v_valorBasePagamento           := item.valorBasePagamento;
    v_valorFreteTotal              := item.valorFreteTotal;
    v_valorSeguroTotal             := item.valorSeguroTotal;
    v_valorDescontoTotal           := item.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := item.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := item.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := item.valorDespesasAduaneirasTotal;
    v_valorImpSomaPagamento        := item.valorImpostosSomaPagamento;
    v_valorImpDiminuiPagamento     := item.valorImpostosDiminuiPagamento;
    v_valorLiquidoItem             := item.valorLiquidoItem;

    IF CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END > 0 THEN
      IF item.geraFinanceiro = 1 AND (v_rateioFretePorControleEntr = 0 OR item.rateioFrete = 1) THEN
        v_idItemOrcamentoRateioFrete := item.idItemOrcamento;
      END IF;
    ELSIF v_rateioFretePorControleEntr = 0 OR item.rateioFrete = 1 THEN
      v_idItemOrcamentoRateioFrete := item.idItemOrcamento;
    END IF;

    -- v_valorFreteGeral
    v_auxNumber := v_residuoFreteGeral +
      CASE
        WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END > 0
        THEN 
          CASE
            WHEN item.geraFinanceiro = 1 AND (v_rateioFretePorControleEntr = 0 OR item.rateioFrete = 1)
            THEN
              CASE
                WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END = 0
                THEN 0
                ELSE p_cab_valorFreteGeral
                  * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
                  / CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END
              END
            ELSE 0
          END
        WHEN v_rateioFretePorControleEntr = 0 OR item.rateioFrete = 1
        THEN
          CASE
            WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFrete ELSE v_valorBaseRateio END = 0
            THEN 0
            ELSE p_cab_valorFreteGeral
              * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
              / CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFrete ELSE v_valorBaseRateio END
          END
        ELSE 0
      END;
    v_valorFreteGeral    := ROUND (v_auxNumber,2);
    v_residuoFreteGeral  := v_auxNumber - v_valorFreteGeral;
    v_saldoRatFreteGeral := v_saldoRatFreteGeral - v_valorFreteGeral;

    -- v_valorSeguroGeral
    v_auxNumber := v_residuoSeguroGeral +
      CASE
        WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END > 0
        THEN 
          CASE
            WHEN item.geraFinanceiro = 1 AND (v_rateioFretePorControleEntr = 0 OR item.rateioFrete = 1)
            THEN
              CASE
                WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END = 0
                THEN 0
                ELSE p_cab_valorSeguroGeral
                  * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
                  / CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END
              END
            ELSE 0
          END
        WHEN v_rateioFretePorControleEntr = 0 OR item.rateioFrete = 1
        THEN
          CASE
            WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFrete ELSE v_valorBaseRateio END = 0
            THEN 0
            ELSE p_cab_valorSeguroGeral
              * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
              / CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFrete ELSE v_valorBaseRateio END
          END
        ELSE 0
      END;
    v_valorSeguroGeral    := ROUND (v_auxNumber,2);
    v_residuoSeguroGeral  := v_auxNumber - v_valorSeguroGeral;
    v_saldoRatSeguroGeral := v_saldoRatSeguroGeral - v_valorSeguroGeral;

    -- v_valorAdicFreteMarinMerGeral
    v_auxNumber := v_residuoAdicFreteMarinGeral +
      CASE
        WHEN v_valorBaseRateioFinanceiro > 0 AND item.geraFinanceiro = 1
        THEN p_cab_valorAdicFreteMarinGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
        WHEN v_valorBaseRateioFinanceiro <= 0 AND v_valorBaseRateio > 0
        THEN p_cab_valorAdicFreteMarinGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateio
        ELSE 0
      END;
    v_valorAdicFreteMarinMerGeral := ROUND (v_auxNumber,2);
    v_residuoAdicFreteMarinGeral  := v_auxNumber - v_valorAdicFreteMarinMerGeral;
    v_saldoRatAdicFreteMarinGeral := v_saldoRatAdicFreteMarinGeral - v_valorAdicFreteMarinMerGeral;

    -- v_valorDespesasAduaneirasGeral
    v_auxNumber := v_residuoDespesasAduanGeral +
      CASE
        WHEN v_valorBaseRateioFinanceiro > 0 AND item.geraFinanceiro = 1
        THEN p_cab_valorDespesasAduanGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
        WHEN v_valorBaseRateioFinanceiro <= 0 AND v_valorBaseRateio > 0
        THEN p_cab_valorDespesasAduanGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateio
        ELSE 0
      END;
    v_valorDespesasAduaneirasGeral := ROUND (v_auxNumber,2);
    v_residuoDespesasAduanGeral    := v_auxNumber - v_valorDespesasAduaneirasGeral;
    v_saldoRatDespesasAduanGeral   := v_saldoRatDespesasAduanGeral - v_valorDespesasAduaneirasGeral;

    -- v_valorOutrasDespesasGeral
    v_auxNumber := v_residuoOutrasDespesasGeral +
      CASE
        WHEN v_valorBaseRateioFinanceiro > 0 AND item.geraFinanceiro = 1
        THEN p_cab_valorOutrasDespesasGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
        WHEN v_valorBaseRateioFinanceiro <= 0 AND v_valorBaseRateio > 0
        THEN p_cab_valorOutrasDespesasGeral
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateio
        ELSE 0
      END;
    v_valorOutrasDespesasGeral    := ROUND (v_auxNumber,2);
    v_residuoOutrasDespesasGeral  := v_auxNumber - v_valorOutrasDespesasGeral;
    v_saldoRatOutrasDespesasGeral := v_saldoRatOutrasDespesasGeral - v_valorOutrasDespesasGeral;

    -- v_valorOutrasDespesasPagamento
    v_auxNumber := v_residuoOutrasDespPagamento +
      CASE
        WHEN v_valorBaseRateioPagamFinanc > 0 AND item.geraFinanceiro = 1
        THEN p_cab_valorOutrasDespPagamento
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioPagamFinanc
        WHEN v_valorBaseRateioPagamFinanc <= 0 AND v_valorBaseRateioPagamento > 0
        THEN p_cab_valorOutrasDespPagamento
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioPagamento
        ELSE 0
      END;
    v_valorOutrasDespesasPagamento := ROUND (v_auxNumber,2);
    v_residuoOutrasDespPagamento := v_auxNumber - v_valorOutrasDespesasPagamento;
    v_saldoRatOutrasDespPagamento := v_saldoRatOutrasDespPagamento - v_valorOutrasDespesasPagamento;

    -- v_valorJurosPagamento
    v_auxNumber := v_residuoJurosPagamento +
      CASE
        WHEN v_valorBaseRateioPagamFinanc > 0 AND item.geraFinanceiro = 1
        THEN p_cab_valorJurosPagamento
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioPagamFinanc
        WHEN v_valorBaseRateioPagamFinanc <= 0 AND v_valorBaseRateioPagamento > 0
        THEN p_cab_valorJurosPagamento
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioPagamento
        ELSE 0
      END;
    v_valorJurosPagamento := ROUND (v_auxNumber,2);
    v_residuoJurosPagamento := v_auxNumber - v_valorJurosPagamento;
    v_saldoRatJurosPagamento := v_saldoRatJurosPagamento - v_valorJurosPagamento;

    -- v_valorDescontoGeral
    v_auxNumber := v_residuoDescontoGeral +
      CASE
        WHEN v_valorBaseRateioDescontoGeral = 0
          OR v_rateioDescontofiltrarSemProm = 1 AND p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral <= 0
          OR v_rateioDescontofiltrarAPrazo  = 1 AND item.aVista = 1
          OR v_rateioDescontofiltrarSemProm = 1 AND item.promocao = 1
        THEN 0
        ELSE (p_cab_valorDescontoGeral - CASE WHEN v_rateioDescontofiltrarSemProm = 1 THEN v_valorDescontoPromocaoGeral ELSE 0 END)
          * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioDescontoGeral
      END +
      CASE
        WHEN p_cab_valorDescontoGeral = 0 OR v_valorDescontoPromocaoGeral = 0 OR item.valorDescontoPromocaoGeral = 0 OR v_rateioDescontofiltrarSemProm = 0
        THEN 0
        WHEN p_cab_valorDescontoGeral < v_valorDescontoPromocaoGeral
        THEN item.valorDescontoPromocaoGeral * p_cab_valorDescontoGeral / v_valorDescontoPromocaoGeral
        ELSE item.valorDescontoPromocaoGeral
      END;
    IF ROUND (v_auxNumber,2) >= v_saldoRatDescontoGeral THEN
      v_valorDescontoGeral := v_saldoRatDescontoGeral;
      v_residuoDescontoGeral := 0;
    ELSE
      v_valorDescontoGeral := ROUND (v_auxNumber,2);
      v_residuoDescontoGeral := v_auxNumber - v_valorDescontoGeral;
    END IF;
    v_saldoRatDescontoGeral := v_saldoRatDescontoGeral - v_valorDescontoGeral;

    -- v_valorDescontoPagamento
    v_auxNumber := v_residuoDescontoPagamento +
      CASE
        WHEN v_valorBaseRateioPagamFinDesc > 0 AND item.geraFinanceiro = 1
        THEN
          CASE
            WHEN p_cab_valorDescontoPagamento = 0
              OR v_rateioDescontofiltrarSemProm = 1 AND p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen <= 0
              OR v_rateioDescontofiltrarAPrazo  = 1 AND item.aVista = 1
              OR v_rateioDescontofiltrarSemProm = 1 AND item.promocao = 1
            THEN 0
            ELSE (p_cab_valorDescontoPagamento - CASE WHEN v_rateioDescontofiltrarSemProm = 1 THEN v_valorDescontoPromocaoPagamen ELSE 0 END)
              * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
              / v_valorBaseRateioPagamFinDesc
          END
        WHEN v_valorBaseRateioPagamFinDesc <= 0 AND v_valorBaseRateioPagamDesconto > 0
        THEN
          CASE
            WHEN p_cab_valorDescontoPagamento = 0
              OR v_rateioDescontofiltrarSemProm = 1 AND p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen <= 0
              OR v_rateioDescontofiltrarAPrazo  = 1 AND item.aVista = 1
              OR v_rateioDescontofiltrarSemProm = 1 AND item.promocao = 1
            THEN 0
            ELSE (p_cab_valorDescontoPagamento - CASE WHEN v_rateioDescontofiltrarSemProm = 1 THEN v_valorDescontoPromocaoPagamen ELSE 0 END)
              * (CASE WHEN p_modDoc_diminuiDescontoPrUnit = 1 OR p_modDoc_somaAcrescimosPrUnit = 1 or p_modDoc_somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem)
              / v_valorBaseRateioPagamDesconto
          END
        ELSE 0
      END +
      CASE
        WHEN p_cab_valorDescontoPagamento = 0 OR v_valorDescontoPromocaoPagamen = 0 OR item.valorDescontoPromocaoPagamento = 0 OR v_rateioDescontofiltrarSemProm = 0
        THEN 0
        WHEN p_cab_valorDescontoPagamento < v_valorDescontoPromocaoPagamen
        THEN item.valorDescontoPromocaoPagamento * p_cab_valorDescontoPagamento / v_valorDescontoPromocaoPagamen
        ELSE item.valorDescontoPromocaoPagamento
      END;
    IF ROUND (v_auxNumber,2) >= v_saldoRatDescontoPagamento THEN
      v_valorDescontoPagamento := v_saldoRatDescontoPagamento;
      v_residuoDescontoPagamento := 0;
    ELSE
      v_valorDescontoPagamento := ROUND (v_auxNumber,2);
      v_residuoDescontoPagamento := v_auxNumber - v_valorDescontoPagamento;
    END IF;
    v_saldoRatDescontoPagamento := v_saldoRatDescontoPagamento - v_valorDescontoPagamento;

    -- Recalcula Valores
    ADD_CALCULA_TOTAIS_ITEM(
      p_cab_tipoPagamentoFrete,
      p_modDoc_diminuiDescontoPrUnit,
      p_modDoc_somaAcrescimosPrUnit,
      p_modDoc_somaFreteSeguroPrUnit,
      item.quantidade,
      item.quantidadeConvertida,
      item.precoUnitarioBruto,
      item.acrescimoUnitarioComposicao,
      item.precoUnitario,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      v_valorFreteGeral,
      v_valorSeguroGeral,
      v_valorDescontoGeral,
      v_valorOutrasDespesasGeral,
      v_valorAdicFreteMarinMerGeral,
      v_valorDespesasAduaneirasGeral,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      0,
      0,
      0,
      0,
      /* Retornos */
      v_precoUnitario,
      v_precoUnitarioConvertido,
      v_valorProdutoServico,
      v_auxNumber,
      v_auxNumber,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      v_auxNumber,
      v_auxNumber);
    IF p_cab_impostosEditados = 0 
        OR v_valorProdutoServico <> item.valorProdutoServico
        OR CASE WHEN p_cab_tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorFreteTotal END
        <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE p_cab_tipoPagamentoFrete END = 'V' THEN 0 ELSE item.valorFreteTotal END
        OR CASE WHEN p_cab_tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorSeguroTotal END
        <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE p_cab_tipoPagamentoFrete END = 'V' THEN 0 ELSE item.valorSeguroTotal END
        OR v_valorDescontoTotal <> item.valorDescontoTotal
        OR v_valorOutrasDespesasTotal <> item.valorOutrasDespesasTotal
        OR v_valorAdicFreteMarinMerTotal <> item.valorAdicFreteMarinhaMerTotal
        OR v_valorDespesasAduaneirasTotal <> item.valorDespesasAduaneirasTotal
        OR v_precoUnitario <> item.precoUnitario
        OR v_valorProdutoServico <> item.valorProdutoServico
    THEN
      r_calcularImpostosItem := 1;
    END IF;
    ADD_CALCULA_VALOR_LIQUIDO (
      0,
      p_cab_tipoPagamentoFrete,
      item.geraFinanceiro,
      v_valorProdutoServico,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      item.valorIRRF,
      item.valorINSS,
      item.valorRetPIS,
      item.valorRetCOFINS,
      item.valorRetCSLL,
      item.valorII,
      item.valorIOF,
      item.valorIPI,
      0,
      item.valorICMSST,
      0,
      0,
      0,
      /* Retornos */
      v_valorBasePagamento,
      v_valorImpSomaPagamento,
      v_valorImpDiminuiPagamento,
      v_valorLiquidoItem);
    -- Atualiza Item
    UPDATE MOORCAMENTOXITENS SET
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorFreteGeral               = v_valorFreteGeral,
      valorSeguroGeral              = v_valorSeguroGeral,
      valorDescontoGeral            = v_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
      valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
      valorBasePagamento            = v_valorBasePagamento,
      valorDescontoPagamento        = v_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
      valorJurosPagamento           = v_valorJurosPagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      valorImpostosSomaPagamento    = v_valorImpSomaPagamento,
      valorImpostosDiminuiPagamento = v_valorImpDiminuiPagamento,
      valorLiquidoItem              = v_valorLiquidoItem
    WHERE idItemOrcamento           = item.idItemOrcamento;
    -- Totaliza cabeçalho
    IF item.servico = 1 THEN
      r_cab_valorServicos            := r_cab_valorServicos + v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos            := r_cab_valorProdutos + v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_valorBasePagamento;
    IF item.usarPrecoAVista = 1 AND item.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
    r_cab_valorImpSomaPagamento    := r_cab_valorImpSomaPagamento + v_valorImpSomaPagamento;
    r_cab_valorImpDiminuiPagamento := r_cab_valorImpDiminuiPagamento + v_valorImpDiminuiPagamento;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
  END LOOP;
  -- Se sobrou resíduo atualiza último item
  IF v_idItemOrcamentoUltimoItem <> 0 AND (v_saldoRatDescontoGeral <> 0 OR v_saldoRatOutrasDespesasGeral <> 0 OR v_saldoRatDescontoPagamento <> 0 OR v_saldoRatOutrasDespPagamento <> 0 OR v_saldoRatJurosPagamento <> 0 OR v_saldoRatFreteGeral <> 0 OR v_saldoRatSeguroGeral <> 0 OR v_saldoRatAdicFreteMarinGeral <> 0 OR v_saldoRatDespesasAduanGeral <> 0) THEN
    ADD_ORCAMENTO_CALC_IMP_RESIDUO (
      p_troca_tipoPagamentoFrete,
      p_a_cab_tipoPagamentoFrete,
      p_cab_modeloDocumento,
      p_cab_entradaSaida,
      p_cab_atualizaCustoMedio,
      p_cab_tipoPagamentoFrete,
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      r_cab_valorDescontoTotal,
      r_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      p_cab_impostosEditados,
      r_cab_valorImpSomaPagamento,
      r_cab_valorImpDiminuiPagamento,
      r_cab_valorLiquidoItem,
      p_modDoc_diminuiDescontoPrUnit,
      p_modDoc_somaAcrescimosPrUnit,
      p_modDoc_somaFreteSeguroPrUnit,
      CASE WHEN v_idItemOrcamentoRateioFrete = 0 THEN v_idItemOrcamentoUltimoItem ELSE v_idItemOrcamentoRateioFrete END,
      v_saldoRatFreteGeral,
      v_saldoRatSeguroGeral,
      v_saldoRatDescontoGeral,
      v_saldoRatOutrasDespesasGeral,
      v_saldoRatAdicFreteMarinGeral,
      v_saldoRatDespesasAduanGeral,
      v_saldoRatDescontoPagamento,
      v_saldoRatOutrasDespPagamento,
      v_saldoRatJurosPagamento,
      r_calcularImpostosItem,
      /* Retornos */
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      r_cab_valorDescontoTotal,
      r_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      r_cab_valorImpSomaPagamento,
      r_cab_valorImpDiminuiPagamento,
      r_cab_valorLiquidoItem,
      r_calcularImpostosItem);
  END IF;
END ADD_ORCAMENTO_CALC_IMP_RATEIO;

/

INSERT INTO SIVERSOESSISTEMA (idVersaoSistema, versaoAplicativo, dataLiberacaoVersao, possuiConversaoTabelas, atualizada, dataAtualizacaoVersao, observacoes) VALUES (2022002030, '2022.2.30', sysdate, 1, 1, sysdate, ' ');

COMMIT;

--exec dbms_utility.compile_schema('ADDERI');
--exec dbms_stats.gather_schema_stats('ADDERI');

/*
*/