@@ -641,16 +641,16 @@ export class ChatwootService {
641641 const isLid = body . key . addressingMode === 'lid' ;
642642 const isGroup = body . key . remoteJid . endsWith ( '@g.us' ) ;
643643 let phoneNumber = isLid && ! isGroup ? body . key . remoteJidAlt : body . key . remoteJid ;
644- let { remoteJid } = body . key ;
644+ const { remoteJid } = body . key ;
645645
646646 // CORREÇÃO LID: Resolve LID para número normal antes de processar
647647 if ( isLid && ! isGroup ) {
648648 const resolvedPhone = await this . resolveLidToPhone ( instance , body . key ) ;
649-
649+
650650 if ( resolvedPhone && resolvedPhone !== remoteJid ) {
651651 this . logger . verbose ( `LID detected and resolved: ${ remoteJid } → ${ resolvedPhone } ` ) ;
652652 phoneNumber = resolvedPhone ;
653-
653+
654654 // Salva mapeamento se temos remoteJidAlt
655655 if ( body . key . remoteJidAlt ) {
656656 this . saveLidMapping ( remoteJid , body . key . remoteJidAlt ) ;
@@ -974,9 +974,7 @@ export class ChatwootService {
974974 const sourceReplyId = quotedMsg ?. chatwootMessageId || null ;
975975
976976 // Filtra valores null/undefined do content_attributes para evitar erro 406
977- const filteredReplyToIds = Object . fromEntries (
978- Object . entries ( replyToIds ) . filter ( ( [ _ , value ] ) => value != null )
979- ) ;
977+ const filteredReplyToIds = Object . fromEntries ( Object . entries ( replyToIds ) . filter ( ( [ , value ] ) => value != null ) ) ;
980978
981979 // Monta o objeto data, incluindo content_attributes apenas se houver dados válidos
982980 const messageData : any = {
@@ -1132,9 +1130,7 @@ export class ChatwootService {
11321130 const replyToIds = await this . getReplyToIds ( messageBody , instance ) ;
11331131
11341132 // Filtra valores null/undefined antes de enviar
1135- const filteredReplyToIds = Object . fromEntries (
1136- Object . entries ( replyToIds ) . filter ( ( [ _ , value ] ) => value != null )
1137- ) ;
1133+ const filteredReplyToIds = Object . fromEntries ( Object . entries ( replyToIds ) . filter ( ( [ , value ] ) => value != null ) ) ;
11381134
11391135 if ( Object . keys ( filteredReplyToIds ) . length > 0 ) {
11401136 const contentAttrs = JSON . stringify ( filteredReplyToIds ) ;
@@ -1841,32 +1837,32 @@ export class ChatwootService {
18411837 }
18421838
18431839 private getTypeMessage ( msg : any ) {
1844- const types = {
1845- conversation : msg . conversation ,
1846- imageMessage : msg . imageMessage ?. caption ,
1847- videoMessage : msg . videoMessage ?. caption ,
1848- extendedTextMessage : msg . extendedTextMessage ?. text ,
1849- messageContextInfo : msg . messageContextInfo ?. stanzaId ,
1850- stickerMessage : undefined ,
1851- documentMessage : msg . documentMessage ?. caption ,
1852- documentWithCaptionMessage : msg . documentWithCaptionMessage ?. message ?. documentMessage ?. caption ,
1853- audioMessage : msg . audioMessage ? ( msg . audioMessage . caption ?? '' ) : undefined ,
1854- contactMessage : msg . contactMessage ?. vcard ,
1855- contactsArrayMessage : msg . contactsArrayMessage ,
1856- locationMessage : msg . locationMessage ,
1857- liveLocationMessage : msg . liveLocationMessage ,
1858- listMessage : msg . listMessage ,
1859- listResponseMessage : msg . listResponseMessage ,
1860- orderMessage : msg . orderMessage ,
1861- quotedProductMessage : msg . contextInfo ?. quotedMessage ?. productMessage ,
1862- viewOnceMessageV2 :
1863- msg ?. message ?. viewOnceMessageV2 ?. message ?. imageMessage ?. url ||
1864- msg ?. message ?. viewOnceMessageV2 ?. message ?. videoMessage ?. url ||
1865- msg ?. message ?. viewOnceMessageV2 ?. message ?. audioMessage ?. url ,
1866- } ;
1867-
1868- return types ;
1869- }
1840+ const types = {
1841+ conversation : msg . conversation ,
1842+ imageMessage : msg . imageMessage ?. caption ,
1843+ videoMessage : msg . videoMessage ?. caption ,
1844+ extendedTextMessage : msg . extendedTextMessage ?. text ,
1845+ messageContextInfo : msg . messageContextInfo ?. stanzaId ,
1846+ stickerMessage : undefined ,
1847+ documentMessage : msg . documentMessage ?. caption ,
1848+ documentWithCaptionMessage : msg . documentWithCaptionMessage ?. message ?. documentMessage ?. caption ,
1849+ audioMessage : msg . audioMessage ? ( msg . audioMessage . caption ?? '' ) : undefined ,
1850+ contactMessage : msg . contactMessage ?. vcard ,
1851+ contactsArrayMessage : msg . contactsArrayMessage ,
1852+ locationMessage : msg . locationMessage ,
1853+ liveLocationMessage : msg . liveLocationMessage ,
1854+ listMessage : msg . listMessage ,
1855+ listResponseMessage : msg . listResponseMessage ,
1856+ orderMessage : msg . orderMessage ,
1857+ quotedProductMessage : msg . contextInfo ?. quotedMessage ?. productMessage ,
1858+ viewOnceMessageV2 :
1859+ msg ?. message ?. viewOnceMessageV2 ?. message ?. imageMessage ?. url ||
1860+ msg ?. message ?. viewOnceMessageV2 ?. message ?. videoMessage ?. url ||
1861+ msg ?. message ?. viewOnceMessageV2 ?. message ?. audioMessage ?. url ,
1862+ } ;
1863+
1864+ return types ;
1865+ }
18701866
18711867 private getMessageContent ( types : any ) {
18721868 const typeKey = Object . keys ( types ) . find ( ( key ) => types [ key ] !== undefined ) ;
@@ -1894,39 +1890,39 @@ export class ChatwootService {
18941890 this . processedOrderIds . set ( result . orderId , now ) ;
18951891 }
18961892 // Tratamento de Produto citado (WhatsApp Desktop)
1897- if ( typeKey === 'quotedProductMessage' && result ?. product ) {
1898- const product = result . product ;
1899-
1900- // Extrai preço
1901- let rawPrice = 0 ;
1902- const amount = product . priceAmount1000 ;
1903-
1904- if ( Long . isLong ( amount ) ) {
1905- rawPrice = amount . toNumber ( ) ;
1906- } else if ( amount && typeof amount === 'object' && 'low' in amount ) {
1907- rawPrice = Long . fromValue ( amount ) . toNumber ( ) ;
1908- } else if ( typeof amount === 'number' ) {
1909- rawPrice = amount ;
1910- }
1893+ if ( typeKey === 'quotedProductMessage' && result ?. product ) {
1894+ const product = result . product ;
19111895
1912- const price = ( rawPrice / 1000 ) . toLocaleString ( 'pt-BR' , {
1913- style : 'currency' ,
1914- currency : product . currencyCode || 'BRL' ,
1915- } ) ;
1916-
1917- const productTitle = product . title || 'Produto do catálogo' ;
1918- const productId = product . productId || 'N/A' ;
1919-
1920- return (
1921- `🛒 *PRODUTO DO CATÁLOGO (Desktop)*\n` +
1922- `━━━━━━━━━━━━━━━━━━━━━\n` +
1923- `📦 *Produto:* ${ productTitle } \n` +
1924- `💰 *Preço:* ${ price } \n` +
1925- `🆔 *Código:* ${ productId } \n` +
1926- `━━━━━━━━━━━━━━━━━━━━━\n` +
1927- `_Cliente perguntou: "${ types . conversation || 'Me envia este produto?' } "_`
1928- ) ;
1929- }
1896+ // Extrai preço
1897+ let rawPrice = 0 ;
1898+ const amount = product . priceAmount1000 ;
1899+
1900+ if ( Long . isLong ( amount ) ) {
1901+ rawPrice = amount . toNumber ( ) ;
1902+ } else if ( amount && typeof amount === 'object' && 'low' in amount ) {
1903+ rawPrice = Long . fromValue ( amount ) . toNumber ( ) ;
1904+ } else if ( typeof amount === 'number' ) {
1905+ rawPrice = amount ;
1906+ }
1907+
1908+ const price = ( rawPrice / 1000 ) . toLocaleString ( 'pt-BR' , {
1909+ style : 'currency' ,
1910+ currency : product . currencyCode || 'BRL' ,
1911+ } ) ;
1912+
1913+ const productTitle = product . title || 'Produto do catálogo' ;
1914+ const productId = product . productId || 'N/A' ;
1915+
1916+ return (
1917+ `🛒 *PRODUTO DO CATÁLOGO (Desktop)*\n` +
1918+ `━━━━━━━━━━━━━━━━━━━━━\n` +
1919+ `📦 *Produto:* ${ productTitle } \n` +
1920+ `💰 *Preço:* ${ price } \n` +
1921+ `🆔 *Código:* ${ productId } \n` +
1922+ `━━━━━━━━━━━━━━━━━━━━━\n` +
1923+ `_Cliente perguntou: "${ types . conversation || 'Me envia este produto?' } "_`
1924+ ) ;
1925+ }
19301926 if ( typeKey === 'orderMessage' ) {
19311927 // Extrai o valor - pode ser Long, objeto {low, high}, ou número direto
19321928 let rawPrice = 0 ;
@@ -2166,11 +2162,11 @@ if (typeKey === 'quotedProductMessage' && result?.product) {
21662162 if ( body ?. key ?. remoteJid && body . key . remoteJid . includes ( '@lid' ) && ! body . key . remoteJid . endsWith ( '@g.us' ) ) {
21672163 const originalJid = body . key . remoteJid ;
21682164 const resolvedPhone = await this . resolveLidToPhone ( instance , body . key ) ;
2169-
2165+
21702166 if ( resolvedPhone && resolvedPhone !== originalJid ) {
21712167 this . logger . verbose ( `Event LID resolved: ${ originalJid } → ${ resolvedPhone } ` ) ;
21722168 body . key . remoteJid = resolvedPhone ;
2173-
2169+
21742170 // Salva mapeamento se temos remoteJidAlt
21752171 if ( body . key . remoteJidAlt ) {
21762172 this . saveLidMapping ( originalJid , body . key . remoteJidAlt ) ;
@@ -2748,13 +2744,13 @@ if (typeKey === 'quotedProductMessage' && result?.product) {
27482744 if ( ! lid || ! phoneNumber || ! lid . includes ( '@lid' ) ) {
27492745 return ;
27502746 }
2751-
2747+
27522748 this . cleanLidCache ( ) ;
27532749 this . lidToPhoneMap . set ( lid , {
27542750 phone : phoneNumber ,
27552751 timestamp : Date . now ( ) ,
27562752 } ) ;
2757-
2753+
27582754 this . logger . verbose ( `LID mapping saved: ${ lid } → ${ phoneNumber } ` ) ;
27592755 }
27602756
@@ -2764,7 +2760,7 @@ if (typeKey === 'quotedProductMessage' && result?.product) {
27642760 */
27652761 private async resolveLidToPhone ( instance : InstanceDto , messageKey : any ) : Promise < string | null > {
27662762 const { remoteJid, remoteJidAlt } = messageKey ;
2767-
2763+
27682764 // Se não for LID, retorna o próprio remoteJid
27692765 if ( ! remoteJid || ! remoteJid . includes ( '@lid' ) ) {
27702766 return remoteJid ;
@@ -2788,7 +2784,7 @@ if (typeKey === 'quotedProductMessage' && result?.product) {
27882784 try {
27892785 const lidIdentifier = this . normalizeJidIdentifier ( remoteJid ) ;
27902786 const contact = await this . findContactByIdentifier ( instance , lidIdentifier ) ;
2791-
2787+
27922788 if ( contact && contact . phone_number ) {
27932789 // Converte +554498860240 → 554498860240@s.whatsapp.net
27942790 const phoneNumber = contact . phone_number . replace ( '+' , '' ) + '@s.whatsapp.net' ;
0 commit comments