mirror of
				https://github.com/invoiceninja/invoiceninja.git
				synced 2025-11-04 06:27:35 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			224 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			224 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace App\Console\Commands;
 | 
						|
 | 
						|
use Utils;
 | 
						|
use stdClass;
 | 
						|
use App\Models\Account;
 | 
						|
use Faker\Factory;
 | 
						|
use Illuminate\Console\Command;
 | 
						|
 | 
						|
/**
 | 
						|
 * Class CreateLuisData.
 | 
						|
 */
 | 
						|
class CreateLuisData extends Command
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    protected $description = 'Create LUIS Data';
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    protected $signature = 'ninja:create-luis-data {faker_field=name}';
 | 
						|
 | 
						|
    /**
 | 
						|
     * CreateLuisData constructor.
 | 
						|
     *
 | 
						|
     */
 | 
						|
    public function __construct()
 | 
						|
    {
 | 
						|
        parent::__construct();
 | 
						|
 | 
						|
        $this->faker = Factory::create();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return bool
 | 
						|
     */
 | 
						|
    public function fire()
 | 
						|
    {
 | 
						|
        $this->fakerField = $this->argument('faker_field');
 | 
						|
 | 
						|
        $intents = [];
 | 
						|
        $entityTypes = [
 | 
						|
            ENTITY_INVOICE,
 | 
						|
            ENTITY_QUOTE,
 | 
						|
            ENTITY_CLIENT,
 | 
						|
            ENTITY_CREDIT,
 | 
						|
            ENTITY_EXPENSE,
 | 
						|
            ENTITY_PAYMENT,
 | 
						|
            ENTITY_PRODUCT,
 | 
						|
            ENTITY_RECURRING_INVOICE,
 | 
						|
            ENTITY_TASK,
 | 
						|
            ENTITY_VENDOR,
 | 
						|
        ];
 | 
						|
 | 
						|
        foreach ($entityTypes as $entityType) {
 | 
						|
            $intents = array_merge($intents, $this->createIntents($entityType));
 | 
						|
        }
 | 
						|
 | 
						|
        $intents = array_merge($intents, $this->getNavigateToIntents($entityType));
 | 
						|
 | 
						|
        $this->info(json_encode($intents));
 | 
						|
    }
 | 
						|
 | 
						|
    private function createIntents($entityType)
 | 
						|
    {
 | 
						|
        $intents = [];
 | 
						|
 | 
						|
        $intents = array_merge($intents, $this->getCreateEntityIntents($entityType));
 | 
						|
        $intents = array_merge($intents, $this->getFindEntityIntents($entityType));
 | 
						|
        $intents = array_merge($intents, $this->getListEntityIntents($entityType));
 | 
						|
 | 
						|
        return $intents;
 | 
						|
    }
 | 
						|
 | 
						|
    private function getCreateEntityIntents($entityType)
 | 
						|
    {
 | 
						|
        $intents = [];
 | 
						|
        $phrases = [
 | 
						|
            "create new {$entityType}",
 | 
						|
            "new {$entityType}",
 | 
						|
            "make a {$entityType}",
 | 
						|
        ];
 | 
						|
 | 
						|
        foreach ($phrases as $phrase) {
 | 
						|
            $intents[] = $this->createIntent('CreateEntity', $phrase, [
 | 
						|
                $entityType => 'EntityType',
 | 
						|
            ]);
 | 
						|
            if ($entityType != ENTITY_CLIENT) {
 | 
						|
                $client = $this->faker->{$this->fakerField};
 | 
						|
                $phrase .= " for {$client}";
 | 
						|
                $intents[] = $this->createIntent('CreateEntity', $phrase, [
 | 
						|
                    $entityType => 'EntityType',
 | 
						|
                    $client => 'Name',
 | 
						|
                ]);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        return $intents;
 | 
						|
    }
 | 
						|
 | 
						|
    private function getFindEntityIntents($entityType)
 | 
						|
    {
 | 
						|
        $intents = [];
 | 
						|
 | 
						|
        if (in_array($entityType, [ENTITY_CLIENT, ENTITY_INVOICE, ENTITY_QUOTE])) {
 | 
						|
            $name = $entityType === ENTITY_CLIENT ? $this->faker->{$this->fakerField} : $this->faker->randomNumber(4);
 | 
						|
            $intents[] = $this->createIntent('FindEntity', "find {$entityType} {$name}", [
 | 
						|
                $entityType => 'EntityType',
 | 
						|
                $name => 'Name',
 | 
						|
            ]);
 | 
						|
            if ($entityType === ENTITY_CLIENT) {
 | 
						|
                $name = $this->faker->{$this->fakerField};
 | 
						|
                $intents[] = $this->createIntent('FindEntity', "find {$name}", [
 | 
						|
                    $name => 'Name',
 | 
						|
                ]);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        return $intents;
 | 
						|
    }
 | 
						|
 | 
						|
    private function getListEntityIntents($entityType)
 | 
						|
    {
 | 
						|
        $intents = [];
 | 
						|
        $entityTypePlural = Utils::pluralizeEntityType($entityType);
 | 
						|
 | 
						|
        $intents[] = $this->createIntent('ListEntity', "show me {$entityTypePlural}", [
 | 
						|
            $entityTypePlural => 'EntityType',
 | 
						|
        ]);
 | 
						|
        $intents[] = $this->createIntent('ListEntity', "list {$entityTypePlural}", [
 | 
						|
            $entityTypePlural => 'EntityType',
 | 
						|
        ]);
 | 
						|
 | 
						|
        $intents[] = $this->createIntent('ListEntity', "show me active {$entityTypePlural}", [
 | 
						|
            $entityTypePlural => 'EntityType',
 | 
						|
            'active' => 'Filter',
 | 
						|
        ]);
 | 
						|
        $intents[] = $this->createIntent('ListEntity', "list archived and deleted {$entityTypePlural}", [
 | 
						|
            $entityTypePlural => 'EntityType',
 | 
						|
            'archived' => 'Filter',
 | 
						|
            'deleted' => 'Filter',
 | 
						|
        ]);
 | 
						|
 | 
						|
        if ($entityType != ENTITY_CLIENT) {
 | 
						|
            $client = $this->faker->{$this->fakerField};
 | 
						|
            $intents[] = $this->createIntent('ListEntity', "list {$entityTypePlural} for {$client}", [
 | 
						|
                $entityTypePlural => 'EntityType',
 | 
						|
                $client => 'Name',
 | 
						|
            ]);
 | 
						|
            $intents[] = $this->createIntent('ListEntity', "show me {$client}'s {$entityTypePlural}", [
 | 
						|
                $entityTypePlural => 'EntityType',
 | 
						|
                $client . '\'s' => 'Name',
 | 
						|
            ]);
 | 
						|
            $intents[] = $this->createIntent('ListEntity', "show me {$client}'s active {$entityTypePlural}", [
 | 
						|
                $entityTypePlural => 'EntityType',
 | 
						|
                $client . '\'s'  => 'Name',
 | 
						|
                'active' => 'Filter',
 | 
						|
            ]);
 | 
						|
        }
 | 
						|
 | 
						|
        return $intents;
 | 
						|
    }
 | 
						|
 | 
						|
    private function getNavigateToIntents($entityType)
 | 
						|
    {
 | 
						|
        $intents = [];
 | 
						|
        $locations = array_merge(Account::$basicSettings, Account::$advancedSettings);
 | 
						|
 | 
						|
        foreach ($locations as $location) {
 | 
						|
            $location = str_replace('_', ' ', $location);
 | 
						|
            $intents[] = $this->createIntent('NavigateTo', "go to {$location}", [
 | 
						|
                $location => 'Location',
 | 
						|
            ]);
 | 
						|
            $intents[] = $this->createIntent('NavigateTo', "show me {$location}", [
 | 
						|
                $location => 'Location',
 | 
						|
            ]);
 | 
						|
        }
 | 
						|
 | 
						|
        return $intents;
 | 
						|
    }
 | 
						|
 | 
						|
    private function createIntent($name, $text, $entities)
 | 
						|
    {
 | 
						|
        $intent = new stdClass();
 | 
						|
        $intent->intent = $name;
 | 
						|
        $intent->text = $text;
 | 
						|
        $intent->entities = [];
 | 
						|
 | 
						|
        foreach ($entities as $value => $entity) {
 | 
						|
            $startPos = strpos($text, (string)$value);
 | 
						|
            if (! $startPos) {
 | 
						|
                dd("Failed to find {$value} in {$text}");
 | 
						|
            }
 | 
						|
            $entityClass = new stdClass();
 | 
						|
            $entityClass->entity = $entity;
 | 
						|
            $entityClass->startPos = $startPos;
 | 
						|
            $entityClass->endPos = $entityClass->startPos + strlen($value) - 1;
 | 
						|
            $intent->entities[] = $entityClass;
 | 
						|
        }
 | 
						|
 | 
						|
        return $intent;
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    protected function getArguments()
 | 
						|
    {
 | 
						|
        return [];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    protected function getOptions()
 | 
						|
    {
 | 
						|
        return [];
 | 
						|
    }
 | 
						|
}
 |