Skip to content

J3 vita ihany efa amn 4 maraina #343

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .docker/php/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local

#Nodejs
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash -
RUN apt install nodejs -y
RUN apt install nodejs -y \
&& apt-get install -y npm

RUN groupadd -g 1000 daybyday
RUN useradd -u 1000 -ms /bin/bash daybyday -g daybyday
Expand Down
34 changes: 34 additions & 0 deletions app/Api/v1/Controllers/ConnexionController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php

namespace App\Api\v1\Controllers;

use App\Models\User;
use Illuminate\Support\Facades\Hash;
use Illuminate\Http\Request;



class ConnexionController extends ApiController{
public function login(Request $request) {
$request->validate([
'email' => 'required|email',
'password' => 'required'
]);

$user = User::where('email', $request->email)->first();

if (!$user || !Hash::check($request->password, $user->password)
|| !$user->canChangeRole()) {
return response()->json([
'message' => 'Email ou mot de passe incorrect'
], 401);
}


return response()->json([
'user' => $user
], 200);
}
}

?>
180 changes: 180 additions & 0 deletions app/Api/v1/Controllers/DashBoardApi/DashBoardController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,180 @@
<?php

namespace App\Api\v1\Controllers\DashBoardApi;



use App\Enums\InvoiceStatus;
use App\Enums\OfferStatus;
use App\Http\Controllers\Controller;
use App\Models\Client;
use App\Models\Dashboard\DashboardStats;
use App\Models\Invoice;
use App\Models\InvoiceLine;
use App\Models\Lead;
use App\Models\Offer;
use App\Models\Payment;
use App\Models\Product;
use App\Models\Project;
use App\Models\Task;
use Illuminate\Support\Facades\DB;

class DashBoardController extends Controller
{
public function getStats()
{
$nb_clients = Client::count();
$nb_projects = Project::count();
$nb_leads = Lead::count();
$nb_tasks = Task::count();
$nb_offers = Offer::count();
$nb_offers_conclude = Offer::where('status', 'like', OfferStatus::won()->getStatus())->count();
$nb_offers_decline = Offer::where('status', 'like', OfferStatus::lost()->getStatus())->count();
$nb_offers_progress = Offer::where('status', 'like', OfferStatus::inProgress()->getStatus())->count();
$nb_invoices = Invoice::count();
$nb_payment = Payment::count();

$dashboardData = new DashboardStats(
$nb_clients,
$nb_projects,
$nb_tasks,
$nb_offers,
$nb_offers_conclude,
$nb_offers_decline,
$nb_offers_progress,
$nb_invoices,
$nb_payment,
$nb_leads
);

return response()->json([
'dashboardData' => $dashboardData,
], 200);

}

public function getBestClients()
{
$liste_clients = Client::all();
$client_achat = collect([]);

for ($i = 0; $i < count($liste_clients); $i++) {
$amount_paid = 0;
$liste_invoice = $liste_clients[$i]->invoices()->where('status', 'like', InvoiceStatus::paid()->getStatus())
->orWhere('status', 'like', InvoiceStatus::partialPaid()->getStatus())->where('client_id', $liste_clients[$i]->id)->get();
for ($j = 0; $j < count($liste_invoice); $j++) {
$amount_paid += $liste_invoice[$j]->getAlreadyPaid()->getBigDecimalAmount();
}
$client_achat->put($liste_clients[$i]->company_name, $amount_paid);
}
$top3 = $client_achat->sortDesc()->take(3);
return response()->json([
"top_3_clients" => $top3
], 200);
}

public function getOfferWon()
{
// Récupérer les offres gagnées
$liste_offres = Offer::where('status', 'like', OfferStatus::won()->getStatus())->get();

$gains = 0;

foreach ($liste_offres as $offre) {
// Récupérer les factures associées à cette offre
$invoices = $offre->invoice()->where('offer_id', $offre->id)->get();

if ($invoices->isNotEmpty()) {
foreach ($invoices as $invoice) {
$gains += $invoice->getAlreadyPaid()->getBigDecimalAmount();
}
}
}

return response()->json([
"offre_gains" => $gains
], 200);
}


public function getVentesMensuelles()
{
// Récupérer les factures avec statut payé ou partiellement payé en 2025
$invoices = Invoice::whereYear('due_at', 2025)
->where(function ($query) {
$query->where('status', InvoiceStatus::partialPaid()->getStatus())
->orWhere('status', InvoiceStatus::paid()->getStatus());
})
->get();

// Initialiser un tableau avec tous les mois à 0
$ventesMensuelles = array_fill(1, 12, 0);

// Ajouter les montants des factures aux mois correspondants
foreach ($invoices as $invoice) {
$mois = (int) $invoice->due_at->format('n'); // Mois sous forme d'entier (1-12)
$ventesMensuelles[$mois] += $invoice->getAlreadyPaid()->getBigDecimalAmount();
}

// Reformater les données pour une meilleure lisibilité
$result = [];
foreach ($ventesMensuelles as $mois => $montant) {
$result[] = [

'mois' => $mois,
'montant' => $montant
]
;
}

// Retourner les données en JSON
return response()->json(['ventes' => $result]);
}
public function getBestProducts()
{
$list_products = Product::all();
$averina = collect([]);




foreach ($list_products as $product) {
$total_amount = InvoiceLine::where('product_id', $product->id)
->whereHas('invoice', function ($query) {
$query->whereIn('status', [InvoiceStatus::partialPaid()->getStatus(), InvoiceStatus::paid()->getStatus(), InvoiceStatus::unpaid()->getStatus()]);
})
->sum(DB::raw('price * quantity'));

$averina->put($product->name, $total_amount / 100);
}
$top3 = $averina->sortDesc()->take(3);
return response()->json(['top_produits' => $top3], 200);
}

public function getInvoicesTotal()
{
$paidAmount = 0;
$remainingAmount = 0;
$invoices = Invoice::whereNotNull('offer_id')->get();
foreach ($invoices as $invoice) {
$paidAmount += $invoice->getAlreadyPaid()->getBigDecimalAmount();
$remainingAmount += $invoice->getTotalPriceAttribute()->getBigDecimalAmount()- $invoice->getAlreadyPaid()->getBigDecimalAmount();
}
return response()->json([
'invoice_total'=>[
'Paye' => $paidAmount,
'Non paye' => $remainingAmount
]
]);
}







}


?>
126 changes: 126 additions & 0 deletions app/Api/v1/Controllers/DashBoardApi/DetailsTotalController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
<?php
namespace App\Api\v1\Controllers\DashBoardApi;

use App\Enums\InvoiceStatus;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Invoice;
use App\Models\Payment;
class DetailsTotalController extends Controller
{


public function getInvoices()
{
$invoices = Invoice::whereNotNull("offer_id")->get()->map(function ($invoice) {
return [

'id' => $invoice->id,
'total_amount' => $invoice->getTotalPriceAttribute()->getBigDecimalAmount(),
'paid_amount' => $invoice->getAlreadyPaid()->getBigDecimalAmount(),
'remaining_amount' => $invoice->getTotalPriceAttribute()->getBigDecimalAmount() -
$invoice->getAlreadyPaid()->getBigDecimalAmount(),
'status' => $invoice->status
]
;
});

return response()->json(['invoices' => $invoices]);
}

public function getInvoiceById(Request $request)
{
// Récupérer la facture
$invoice = Invoice::where("id", $request->input('id'))->first();

// Vérifier si la facture existe
if (!$invoice) {
return response()->json(['error' => 'Facture non trouvée'], 404);
}

// Construire la réponse
$invoiceData = [
'id' => $invoice->id,
'total_amount' => $invoice->getTotalPriceAttribute()->getBigDecimalAmount(),
'paid_amount' => $invoice->getAlreadyPaid()->getBigDecimalAmount(),
'remaining_amount' => $invoice->getTotalPriceAttribute()->getBigDecimalAmount() -
$invoice->getAlreadyPaid()->getBigDecimalAmount(),
'status' => $invoice->status
];

return response()->json(['invoice' => $invoiceData]);
}


public function getPayments(Request $request){

$payment = Payment::where("invoice_id",$request->input('id'))->get()->map(
function($payment){
return [
'id'=>$payment->id,
'amount'=>$payment->amount/100,
'description'=>$payment->description,
'payment_source'=>$payment->payment_source,
'payment_date'=>$payment->payment_date,
'invoice_id'=>$payment->invoice_id
];
}
);
return response()->json(['payments'=>$payment]);
}

public function getPaymentById(Request $request){
$payment = Payment::where("id",$request->input('id'))->first()
;
$payment->amount = $payment->amount/100;
return response()->json(['payment'=>$payment]);
}

public function editPayment(Request $request){
$payment = Payment::where("id",$request->input("id"))->first();
$invoice = Invoice::where("id",$payment->invoice_id)->first();
$payment->amount = $request->input("amount")*100;
$payment->save();
$reste = $invoice->getTotalPriceAttribute()->getBigDecimalAmount()- $invoice->getAlreadyPaid()->getBigDecimalAmount() ;
if($reste==0){
$invoice->status=InvoiceStatus::paid()->getStatus();
$invoice->save();
}
else if($invoice->getAlreadyPaid()->getBigDecimalAmount() > 0){
$invoice->status=InvoiceStatus::partialPaid()->getStatus();
$invoice->save();
}
else{
$invoice->status=InvoiceStatus::unpaid()->getStatus();
$invoice->save();
}

return response()->json(['payment'=>$payment]);
}

public function deletePayment(Request $request){
$payment = Payment::where("id",$request->input("id"))->first();
$invoice = Invoice::where("id",$payment->invoice_id)->first();
$payment->delete();


$reste = $invoice->getTotalPriceAttribute()->getBigDecimalAmount()- $invoice->getAlreadyPaid()->getBigDecimalAmount() ;
if($reste==0){
$invoice->status=InvoiceStatus::paid()->getStatus();
$invoice->save();
}
else if($invoice->getAlreadyPaid()->getBigDecimalAmount() > 0){
$invoice->status=InvoiceStatus::partialPaid()->getStatus();
$invoice->save();
}
else{
$invoice->status=InvoiceStatus::unpaid()->getStatus();
$invoice->save();
}

return response()->json(['message'=>"Payment supprime"]);
}


}
?>
3 changes: 3 additions & 0 deletions app/Api/v1/Controllers/UserController.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,14 @@
use App\Models\User;
use App\Api\v1\Controllers\ApiController;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;

class UserController extends ApiController
{
public function index()
{
return User::all();
}


}
Loading