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> ) : (