diff --git a/app/Http/Controllers/PeopleController.php b/app/Http/Controllers/PeopleController.php
index b00a19bdd089b4bf5bad3d994ef40d309d3b0496..3fecd633c9560c4027f1487095bffeeaebcdf83d 100644
--- a/app/Http/Controllers/PeopleController.php
+++ b/app/Http/Controllers/PeopleController.php
@@ -147,7 +147,11 @@ class PeopleController extends Controller
             'member.transaction:id,name,amount,rectification,created_at,updated_at',
             'personal_account',
             'personal_account.personal_transactions:id,amount,personal_account_id,transaction_id,created_at,updated_at',
-            'personal_account.personal_transactions.transaction:id,name,amount,rectification,created_at,updated_at'
+            'personal_account.personal_transactions.transaction:id,name,amount,rectification,created_at,updated_at',
+            'sales',
+            'sales.movement',
+            'sales.movement.products',
+            'sales.movement.products.product:name,id,price',
         )->findOrFail($id)->makeVisible('edu_token')->makeHidden('fullname')];
     }
 }
diff --git a/app/Http/Controllers/SalesController.php b/app/Http/Controllers/SalesController.php
index 2b3e0ac9e3436508fd14905e929e13886ca3de51..e8b1c189d06f4ca57f40961cd3117cfaa8e84200 100644
--- a/app/Http/Controllers/SalesController.php
+++ b/app/Http/Controllers/SalesController.php
@@ -22,7 +22,9 @@ class SalesController extends Controller
      */
     public function index(Request $request)
     {
-        return $this->commonIndex($request, Sale::class);
+        return $this->commonIndex($request, Sale::class, [
+            'person_id' => "equals:person_id"
+        ]);
     }
 
     private function calculatePrice($products)
@@ -140,6 +142,8 @@ class SalesController extends Controller
                 'personal_account_id' => $paccount->id,
                 'transaction_id' => $t->id
             ]);
+
+            $sale->person_id = $paccount->person_id;
         }
 
         // We affect the new transaction and movement to the sale
diff --git a/app/Models/Person.php b/app/Models/Person.php
index 6d5f26a8d6da9bc7c0327b434f381c25eace5205..e84ba3a83666037d194866302ba2a5bc1c2c00d3 100644
--- a/app/Models/Person.php
+++ b/app/Models/Person.php
@@ -32,6 +32,12 @@ class Person extends Model
         return $this->hasOne(Member::class);
     }
 
+    // phpcs:ignore
+    public function sales()
+    {
+        return $this->hasMany(Sale::class);
+    }
+
     // phpcs:ignore
     public function users()
     {
diff --git a/app/Models/Sale.php b/app/Models/Sale.php
index 43375fa94ad0360d726b82f9f27dd306d144ab74..4c1fe89658495b3d720651b7ad6bd7a0b4f1fcb3 100644
--- a/app/Models/Sale.php
+++ b/app/Models/Sale.php
@@ -21,6 +21,7 @@ class Sale extends Model
 
     protected $fillable = [
         'transaction_id',
-        'movement_id'
+        'movement_id',
+        'person_id'
     ];
 }
diff --git a/composer.json b/composer.json
index 7eae2ae7d7b2143550ed2f082e46d9713651b706..9c676092143fe7b9ca24d36d483fce2046b84cfc 100644
--- a/composer.json
+++ b/composer.json
@@ -3,7 +3,7 @@
     "type": "project",
     "description": "Management of stocks, member, accounting, sales, ...",
     "license": "AGPL-3.0-or-later",
-    "version": "1.9.1",
+    "version": "1.10.0",
     "require": {
         "php": "^7.3|^8.0",
         "doctrine/dbal": "^3.1",
diff --git a/database/migrations/2014_10_12_000000_create_users_table.php b/database/migrations/2014_10_12_000000_create_users_table.php
index bfab2c917f7c90753948aeca9f160bb8add2e435..7df8029a8034ffe7d9220e878a5d4210ed76d103 100644
--- a/database/migrations/2014_10_12_000000_create_users_table.php
+++ b/database/migrations/2014_10_12_000000_create_users_table.php
@@ -5,6 +5,7 @@ use Illuminate\Database\Schema\Blueprint;
 use Illuminate\Support\Facades\Schema;
 use Illuminate\Support\Facades\Hash;
 use App\Models\User;
+use Illuminate\Support\Facades\DB;
 
 class CreateUsersTable extends Migration
 {
@@ -28,13 +29,13 @@ class CreateUsersTable extends Migration
             $table->timestamp('password_changed_at')->nullable()->default(null);
         });
 
-        $user = User::create([
+        DB::table('users')->insert([
             'username' => 'root',
             'firstname' => 'Chuck',
             'lastname' => 'NORRIS',
             'email' => 'root@localhost',
             'password' => Hash::make('rootroot'),
-            'permissions' => ["*.*"]
+            'permissions' => '["*.*"]'
         ]);
 
         // Ensure next IDs are > 1000.
diff --git a/database/migrations/2021_11_13_133912_add_people_user.php b/database/migrations/2021_11_13_133912_add_people_user.php
index 63183f9304264aac5283b97dfb92c41d113fa429..98cd6a1478b93b1021f2230d7d0c2c65d44fb597 100644
--- a/database/migrations/2021_11_13_133912_add_people_user.php
+++ b/database/migrations/2021_11_13_133912_add_people_user.php
@@ -27,6 +27,17 @@ class AddPeopleUser extends Migration
                     ->where('firstname', $user->firstname)
                     ->where('lastname', $user->lastname)->first();
 
+                if ($person == null) {
+                    $person = DB::table('people')->insert([
+                        'firstname' => $user->firstname,
+                        'lastname' => $user->lastname
+                    ]);
+
+                    $person = DB::table('people')
+                        ->where('firstname', $user->firstname)
+                        ->where('lastname', $user->lastname)->first();
+                }
+
                 DB::table('users')->where('id', $user->id)->update(['person_id' => $person->id]);
             }
         });
diff --git a/database/migrations/2021_11_21_214748_add_sale_person_id.php b/database/migrations/2021_11_21_214748_add_sale_person_id.php
new file mode 100644
index 0000000000000000000000000000000000000000..cf8f962e8ef91b96378178bdfceca6a41b7429ad
--- /dev/null
+++ b/database/migrations/2021_11_21_214748_add_sale_person_id.php
@@ -0,0 +1,60 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Log;
+use Illuminate\Support\Facades\Schema;
+
+class AddSalePersonId extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('sales', function (Blueprint $table) {
+            $table->foreignId('person_id')->nullable()->default(null);
+        });
+
+        DB::transaction(function () {
+            $sales = DB::table('sales')->get();
+            foreach ($sales as $sale) {
+                $transaction = DB::table('transactions')->find($sale->transaction_id);
+                if (!is_null($transaction)) {
+
+                    $other_trans = DB::table('transactions')->where("name", $transaction->name)->get();
+                    if (count($other_trans) == 2) {
+                        foreach ($other_trans as $tr) {
+                            if ($tr->id != $transaction->id) {
+                                $ptr = DB::table('personal_transactions')->where('transaction_id', $tr->id)->first();
+
+                                if (!is_null($ptr)) {
+                                    $pacc = DB::table('personal_accounts')->find($ptr->personal_account_id);
+                                    if (!is_null($pacc)) {
+                                        DB::table('sales')->where('id', $sale->id)->update(['person_id' => $pacc->person_id]);
+                                    }
+                                }
+                                error_log(json_encode($ptr));
+                            }
+                        }
+                    }
+                }
+            }
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('sales', function (Blueprint $table) {
+            $table->dropColumn('person_id');
+        });
+    }
+}
diff --git a/package.json b/package.json
index 5c4143172a4d05d0eadc92625de506ff90ec5d30..f544b51d4a5ab91f602f989741307a1827edeaf4 100644
--- a/package.json
+++ b/package.json
@@ -46,7 +46,7 @@
   },
   "name": "seb",
   "description": "Management of stocks, member, accounting, sales, ...",
-  "version": "1.9.1",
+  "version": "1.10.0",
   "main": "webpack.mix.js",
   "directories": {
     "test": "tests"
diff --git a/resources/js/src/providers/I18nProvider.js b/resources/js/src/providers/I18nProvider.js
index c26501a817091386c765cc1850b978c9208584e9..36d7741b9f1a377b014c6df519cdce72fbb391bd 100644
--- a/resources/js/src/providers/I18nProvider.js
+++ b/resources/js/src/providers/I18nProvider.js
@@ -331,6 +331,7 @@ const messages = {
                     movement_id: 'Mouvement',
                     transaction_id: 'Transaction',
                     'movement.products': 'Produits',
+                    person_id: 'Personne',
                     product_id: 'Produit',
                     count: 'Différence'
                 }
diff --git a/resources/js/src/resources/Sales.js b/resources/js/src/resources/Sales.js
index 38b6088fd1b023fd4556790dc046a5c43692916e..cffc7ec1a3971bd1a9d0f6f7c29da4011fb17e59 100644
--- a/resources/js/src/resources/Sales.js
+++ b/resources/js/src/resources/Sales.js
@@ -1,17 +1,23 @@
 import { TextField as MuiTextField, useMediaQuery } from "@material-ui/core";
 import React, { useState } from "react";
-import { ArrayField, Create, Datagrid, FormDataConsumer, FormTab, List, ReferenceField, SelectInput, ShowButton, SimpleList, SimpleShowLayout, TabbedForm, TextField, useNotify, useRefresh, useTranslate } from 'react-admin';
+import { ArrayField, AutocompleteInput, Create, Datagrid, FormDataConsumer, FormTab, FunctionField, List, ReferenceField, ReferenceInput, SelectInput, ShowButton, SimpleList, SimpleShowLayout, TabbedForm, TextField, useNotify, useRefresh, useTranslate } from 'react-admin';
 import DateField from '../components/DateField';
 import { ShowDialog } from '../components/DialogForm';
 import MoneyField from "../components/MoneyField";
 import { MultiProductCountInput, MultiProductCountItem } from "../components/MultiProductCountInput";
 import PersonalAccountSelector from "../components/PersonalAccountSelector";
 
+const SalesFilters = [
+    <ReferenceInput source="person_id" reference="people" filterToQuery={searchText => ({ fullname: searchText, has_account: true })}>
+        <AutocompleteInput optionText="fullname" />
+    </ReferenceInput>
+];
+
 const Sales = (props) => {
     const isDesktop = useMediaQuery(theme => theme.breakpoints.up('md'));
     return (
         <>
-            <List {...props} bulkActionButtons={false} >
+            <List {...props} filters={SalesFilters} bulkActionButtons={false} >
                 {isDesktop ? (
                     <Datagrid>
                         <TextField source="id" />
@@ -30,6 +36,9 @@ const Sales = (props) => {
                         <ReferenceField source="transaction_id" reference="transactions" link="show">
                             <TextField source="name" />
                         </ReferenceField>
+                        <ReferenceField source="person_id" reference="people" link="show" >
+                            <FunctionField render={r => r.firstname + " " + r.lastname} />
+                        </ReferenceField>
                         <ShowButton />
                     </Datagrid>
                 ) : (