function toText(value: string): string { return String(value ?? ""); } export function hasInventoryPurchaseStem(text: string): boolean { return /купл[а-яёa-z0-9_-]*/iu.test(toText(text)); } export function hasInventorySupplierCue(text: string): boolean { const value = toText(text); if ( /(?:кто\s+(?:(?:это|этот\s+товар|эту\s+позицию)\s+)?(?:нам\s+)?поставил|кто\s+(?:нам\s+)?поставил\s+(?:это|этот\s+товар|эту\s+позицию)|от\s+какого\s+поставщика|у\s+какого\s+поставщика|от\s+кого\s+куплен|у\s+кого\s+купили|у\s+кого\s+куплено|где\s+(?:мы\s+)?купили(?:\s+(?:это|его|этот\s+товар|эту\s+позицию))?|где\s+куплено|supplier|vendor|поставщик)/iu.test( value ) ) { return true; } return hasInventoryPurchaseStem(value) && /(?:у\s+кого|от\s+кого|где)/iu.test(value); } export function hasInventorySaleCue(text: string): boolean { const value = toText(text); if (/(?:buyer|покупател)/iu.test(value)) { return true; } if (/(?:куда\s+ушла\s+позиция|куда\s+ушел\s+товар|кто\s+купил)/iu.test(value)) { return true; } const hasDirectionCue = /(?:кому|каму|куда)/iu.test(value); const hasSaleVerb = /(?:продал(?:и|а|о|ы)?|продан(?:а|о|ы)?|продано|реализовал(?:и|а|о|ы)?|реализован(?:а|о|ы)?|реализовано)/iu.test( value ); if (hasDirectionCue && hasSaleVerb) { return true; } return /(?:^|[\s,.;:!?])(продано|продали|продан(?:а|о|ы)?|реализовано|реализовали|реализован(?:а|о|ы)?)(?=$|[\s,.;:!?])/iu.test( value ); }