finish add product to order , wip bon de commande pdf

This commit is contained in:
Tiavina 2025-02-20 11:08:30 +03:00
parent 0964e70c5f
commit 13768c442b
15 changed files with 282 additions and 63 deletions

View File

@ -163,8 +163,10 @@ return [
['name' => 'order#createDefaultThanatoProductFee','url' => '/thanatoProductFees/createDefaultThanatoProductFee', 'verb' => 'POST'],
['name' => 'order#orderDetails', 'url' => '/order/{orderId}/details', 'verb' => 'GET'],
['name' => 'order#getOrderProductsById', 'url' => '/order/{orderId}/products', 'verb' => 'PROPFIND'],
['name' => 'order#getOrderItemsByOrderId', 'url' => '/order/{orderId}/items', 'verb' => 'PROPFIND'],
['name' => 'order#getOrderTotalAmount', 'url' => '/order/{orderId}/totalAmount', 'verb' => 'PROPFIND'],
['name' => 'order#exportOrderToPdf', 'url' => '/order/{orderId}/exportToPdf', 'verb' => 'POST'],
['name' => 'order#addOrderItems', 'url' => '/order/{orderId}/addItems', 'verb' => 'POST'],
//clients discount
['name' => 'page#getClientGroupDiscounts', 'url' => '/getClientGroupDiscounts', 'verb' => 'PROPFIND'],

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -198,8 +198,6 @@ class OrderController extends Controller {
* @param string $orderId
*/
public function orderDetails($orderId) {
$this->logger->debug("logId");
$this->logger->debug("$orderId");
$orderWithDetail = $this->orderService->getOrderByIdWithDetails($orderId);
return new TemplateResponse(
'gestion',
@ -220,8 +218,8 @@ class OrderController extends Controller {
* @NoCSRFRequired
* @param string $orderId
*/
public function getOrderProductsById($orderId) {
$orderProducts = $this->orderService->getOrderProductsById($orderId);
public function getOrderItemsByOrderId($orderId) {
$orderProducts = $this->orderService->getOrderItemsByOrderId($orderId);
return json_encode($orderProducts);
}
@ -257,15 +255,6 @@ class OrderController extends Controller {
return new TemplateResponse('gestion', 'orderProduct', array('groups' => $this->groups, 'user' => $this->user, 'path' => $this->idNextcloud, 'url' => $this->navigationService->getNavigationLink()));
}
/**
* @NoAdminRequired
* @NoCSRFRequired
*/
public function getOrderProducts() {
$orderProducts = $this->orderService->getOrderProducts();
return $orderProducts;
}
/**
* @NoAdminRequired
* @NoCSRFRequired
@ -280,5 +269,28 @@ class OrderController extends Controller {
}
}
/**
* @NoAdminRequired
* @NoCSRFRequired
*/
public function addOrderItems($orderId) {
try{
$this->orderService->addDefaultOrderItem($orderId);
return true;
}
catch(Exception $e){
return null;
}
}
/**
* @NoAdminRequired
* @NoCSRFRequired
*/
public function getOrderProducts() {
$orderProducts = $this->orderService->getOrderProducts();
return $orderProducts;
}
}

View File

@ -42,13 +42,13 @@ class Bdd {
"fk_client_group_id","fk_produit_id","ht_amount","client_group_name",
"provider_name","provider_last_name","provider_company_name","provider_siret_number","provider_phone","provider_email",
"provider_address","provider_city","fk_provider_id",
"label");
"label","fk_order_id","fk_order_item_id");
$this->whiteTable = array("client", "lieu", "trajet", "devis", "produit_devis", "facture", "produit",
"configuration", "ligne_trajet", "thanato", "article", "defunt", "article_devis",
"bibliotheque", "bijou_defunt", "obs_defunt", "hypo_defunt",
"orders","thanato_product_discount",
"client_group_discount","client_group","provider",
"order_product");
"order_product","order_item");
$this->tableprefix = '*PREFIX*' ."gestion_";
$this->pdo = $db;
$this->l = $l;

View File

@ -97,6 +97,15 @@ class OrderBdd {
return null;
}
private function getLastOrderProductId(){
$sql = "SELECT max(order_product.id) as MAX_ORDER_PRODUCT_ID FROM ".$this->orderTablePrefix."order_product as order_product;";
$result = $this->execSQLNoJsonReturn($sql,[]);
if(!empty($result)){
return $result[0]['MAX_ORDER_PRODUCT_ID'];
}
return 0;
}
public function getOrderByCalendarUuid($calendarUuid){
$sql = "SELECT * FROM ".$this->orderTablePrefix."orders as orders
WHERE orders.fk_calendar_uuid = ? LIMIT 1";
@ -189,10 +198,11 @@ class OrderBdd {
$sql = "SELECT
order_item.id as order_item_id,
order_item.quantity as order_item_quantity,
order_item.fk_order_id as fk_order_id,
order_product.id as order_product_id,
order_product.reference as order_product_reference,
order_product.description as order_product_description,
order_product.prix_unitaire as order_product_ht_price
order_product.label as order_product_label,
order_product.ht_amount as order_product_ht_amount
FROM ".$this->orderTablePrefix."order_item as order_item
LEFT JOIN ".$this->orderTablePrefix."order_product as order_product on order_item.fk_order_item_id = order_product.id
WHERE order_item.fk_order_id = ?;";
@ -376,11 +386,9 @@ class OrderBdd {
orders.order_number,
orders.order_full_number,
orders.order_comment,
orders.fk_defunt_id,
orders.fk_lieu_id,
orders.fk_client_id,
orders.fk_thanato_id,
orders.fk_order_status_key,
orders.fk_order_type_key,
orders.fk_devis_id,
thanato.id as thanato_id,
thanato.nom as thanato_nom,
thanato.prenom as thanato_prenom,
@ -398,14 +406,24 @@ class OrderBdd {
lieu.id as lieu_id,
lieu.adresse as lieu_adresse,
lieu.nom as lieu_nom,
order_status.status_label as order_status_label
order_status.status_label as order_status_label,
provider.provider_name,
provider.provider_last_name,
provider.provider_company_name,
provider.provider_siret_number,
provider.provider_phone,
provider.provider_email,
provider.provider_address,
provider.provider_city
FROM "
.$this->orderTablePrefix."orders as orders
LEFT JOIN ".$this->orderTablePrefix."thanato as thanato on orders.fk_thanato_id = thanato.id
LEFT JOIN ".$this->orderTablePrefix."client as client on orders.fk_client_id = client.id
LEFT JOIN ".$this->orderTablePrefix."defunt as defunt on orders.fk_defunt_id = defunt.id
LEFT JOIN ".$this->orderTablePrefix."lieu as lieu on orders.fk_lieu_id = lieu.id
LEFT JOIN ".$this->orderTablePrefix."devis as devis on orders.fk_devis_id = devis.id
LEFT JOIN ".$this->orderTablePrefix."thanato as thanato on devis.id_thanato = thanato.id
LEFT JOIN ".$this->orderTablePrefix."client as client on devis.id_client = client.id
LEFT JOIN ".$this->orderTablePrefix."defunt as defunt on devis.id_defunt = defunt.id
LEFT JOIN ".$this->orderTablePrefix."lieu as lieu on devis.id_lieu = lieu.id
LEFT JOIN ".$this->orderTablePrefix."order_status as order_status on orders.fk_order_status_key = order_status.status_key
LEFT JOIN ".$this->orderTablePrefix."provider as provider on orders.fk_provider_id = provider.id
WHERE orders.id = ?
LIMIT 1;
"
@ -423,10 +441,10 @@ class OrderBdd {
$totalHt = 0;
$totalTtc = 0;
$totalTvaAmount = 0;
$orderProducts = $this->getOrderProductsByOrderId($orderId);
foreach($orderProducts as $orderProduct){
$totalHt += $orderProduct["produit_ht_price"] * $orderProduct["order_product_quantity"];
$totalTvaAmount += $orderProduct["produit_ht_price"] * $tva / 100;
$orderItems = $this->getOrderItemsByOrderId($orderId);
foreach($orderItems as $orderItem){
$totalHt += $orderItem["order_product_ht_amount"] * $orderItem["order_item_quantity"];
$totalTvaAmount += $orderItem["order_product_ht_amount"] * $tva / 100;
$totalTtc += ($totalHt * ($tva + 100)) / 100;
}
@ -487,4 +505,17 @@ class OrderBdd {
}
return $count;
}
private function addOrderItem($orderId,$orderProductId,$quantity){
$sql = "INSERT INTO `".$this->orderTablePrefix."order_item` (`fk_order_id`,`fk_order_item_id`,`quantity`) VALUES (?,?,?);";
$this->execSQLNoData($sql, array($orderId,$orderProductId,$quantity));
return true;
}
public function addDefaultOrderItem($orderId){
$lastOrderProductId = $this->getLastOrderProductId();
$defaultQuantity = 1;
$this->addOrderItem($orderId,$lastOrderProductId,$defaultQuantity);
return true;
}
}

View File

@ -107,6 +107,10 @@ class OrderService {
return $this->orderBdd->getOrderProductsByOrderId($orderId);
}
public function getOrderItemsByOrderId($orderId){
return $this->orderBdd->getOrderItemsByOrderId($orderId);
}
public function getOrderTotalAmount($orderId,$tva){
return $this->orderBdd->getOrderTotalAmount($orderId,$tva);
}
@ -135,4 +139,8 @@ class OrderService {
public function createDefaultOrderProduct($idNextCloud){
$this->orderBdd->createDefaultOrderProduct($idNextCloud);
}
public function addDefaultOrderItem($orderId){
$this->orderBdd->addDefaultOrderItem($orderId);
}
}

View File

@ -1,11 +1,12 @@
import DataTable from "datatables.net";
import { Order } from "../objects/order.mjs";
import { updateOrderDate } from "../modules/order/orderAjaxRequest.mjs";
import { getOrderItemsByOrderId, loadOrderProductIntoSelect, updateOrderDate } from "../modules/order/orderAjaxRequest.mjs";
import { Thanatopracteur } from "../objects/thanatopracteur.mjs";
import { ThanatoSubcontractorTypeKey } from "../constants/thanatoTypeConstant";
import { hideLoader, showLoader,baseUrl } from "../modules/mainFunction.mjs";
import { showError, showSuccess } from "@nextcloud/dialogs";
import { OrderProduct } from "../objects/orderProduct.mjs";
import { updateDB } from "../modules/ajaxRequest.mjs";
$('body').on('change', '.orderInputDate', function () {
var dt = new DataTable('.tabledt');
@ -56,3 +57,41 @@ $('body').on('click', '#exportOrderToPdf', function () {
});
$('body').on('click', '#addOrderItems', function () {
var orderId = $('#orderId').data('id');
$.ajax({
url: baseUrl + '/order/'+orderId+'/addItems',
type: 'POST',
contentType: 'application/json'
}).done(function (response) {
getOrderItemsByOrderId(orderId);
}).fail(function (response, code) {
showError(t('gestion', "Please create a new product"));
});
});
$('body').on('dblclick', '.selectableOrderItem', function () {
var orderItemId = $(this).data('order-item-id');
var orderProductId = $(this).data('data-order-product-id');
var orderId = $(this).data('order-id');
$(this).text("");
$(this).html('<select id="orderProductList">');
loadOrderProductIntoSelect($('#orderProductList'), orderItemId, orderProductId,orderId);
});
$('body').on('change', '#orderProductList', function () {
var orderItemId = $(this).find(':selected').data('id')
var orderId = $(this).find(':selected').data('order-id')
var orderProductId = $(this).find(':selected').data('val')
var column = $(this).find(':selected').data('column')
var table = $(this).find(':selected').data('table')
var el = $(this).parent();
updateDB(table, column, orderProductId, orderItemId);
getOrderItemsByOrderId(orderId);
el.text($(this).val());
el.attr('data-val', orderProductId);
});

View File

@ -825,3 +825,39 @@ export function exportCareCertificate(defuntIdPayload) {
});
};
/**
* Get a product in database using devisId
*/
export function getProduitsByDevisId(devisId) {
var myData = { numdevis: devisId };
$.ajax({
url: baseUrl + '/getProduitsById',
type: 'POST',
async: false,
contentType: 'application/json',
data: JSON.stringify(myData)
}).done(function (response, code) {
$('#produits tbody').empty();
var total = 0;
var deleteDisable = "";
if ($('#produits').data("type") === "facture") {
deleteDisable = "d-none";
}
$.each(JSON.parse(response), function (arrayID, myresp) {
$('#produits tbody').append('<tr><td><div data-modifier="getProduitsById" data-id="' + myresp.pdid + '" data-table="produit_devis" class="' + deleteDisable + ' deleteItem icon-delete"></div><div style="display:inline;" data-val="' + myresp.pid + '" data-id="' + myresp.pdid + '" class="selectable">' + myresp.reference + '</div></td>' +
'<td>' + myresp.description + '</td>' +
'<td><div class="editableNumber getProduitsById" style="display:inline;" data-modifier="getProduitsById" data-table="produit_devis" data-column="quantite" data-id=' + myresp.pdid + '>' + myresp.quantite + '</div> </td>' +
'<td>' + cur.format(myresp.prix_unitaire) + '</td>' +
'<td>' + cur.format((myresp.quantite * myresp.prix_unitaire)) + '</td></tr>');
total += (myresp.quantite * myresp.prix_unitaire);
});
$("#totaldevis tbody").empty();
getGlobal(devisId);
}).fail(function (response, code) {
showError(response);
});
}

View File

@ -28,25 +28,28 @@ export function updateOrderDate(orderId,dateValue) {
/**
* Get order products
*/
export function getOrderProductsByOrderId(orderId) {
export function getOrderItemsByOrderId(orderId) {
$.ajax({
url: baseUrl + '/order/'+orderId+'/products',
url: baseUrl + '/order/'+orderId+'/items',
type: 'PROPFIND',
async: false,
contentType: 'application/json'
}).done(function (response, code) {
$('#orderProducts tbody').empty();
$('#orderItems tbody').empty();
$.each(JSON.parse(response), function (arrayID, myresp) {
$('#orderProducts tbody').append(
'<tr><td><div data-modifier="getOrderProductsByOrderId" data-id="' + myresp.order_product_id + '" data-table="order_product" class="deleteItem icon-delete"></div><div style="display:inline;">' + myresp.produit_reference + '</div></td>' +
'<td>' + myresp.produit_description + '</td>' +
'<td><div style="display:inline;" data-modifier="getProduitsById">' + myresp.order_product_quantity + '</div> </td>' +
'<td>' + cur.format(myresp.produit_ht_price) + '</td>' +
'<td>' + cur.format((myresp.order_product_quantity * myresp.produit_ht_price)) + '</td></tr>');
$('#orderItems tbody').append(
'<tr>' +
'<td>'+
'<div data-modifier="getOrderItemsByOrderId" data-id="' + myresp.order_item_id + '" data-table="order_item" class="deleteItem icon-delete"></div>'+
'<div class="selectableOrderItem" data-order-item-id="' + myresp.order_item_id +'" data-order-product-id="' + myresp.order_product_id + '" data-order-id="' + orderId + '" style="display:inline;">' + myresp.order_product_reference + '</div></td>' +
'<td>' + myresp.order_product_label + '</td>' +
'<td><div style="display:inline;" data-modifier="getOrderItemsByOrderId">' + myresp.order_item_quantity + '</div> </td>' +
'<td>' + cur.format(myresp.order_product_ht_amount) + '</td>' +
'<td>' + cur.format((myresp.order_item_quantity * myresp.order_product_ht_amount)) + '</td></tr>');
});
$("#totalOrderProducts tbody").empty();
$("#totalOrderItems tbody").empty();
getTotalAmountOfOrder(orderId);
}).fail(function (response, code) {
showError(response);
@ -64,8 +67,8 @@ export function getTotalAmountOfOrder(orderId) {
contentType: 'application/json'
}).done((function (totalAmountResult) {
var totalAmount = JSON.parse(totalAmountResult);
$('#totalOrderProducts tbody').empty();
$('#totalOrderProducts tbody').append(
$('#totalOrderItems tbody').empty();
$('#totalOrderItems tbody').append(
'<tr>'+
'<td style="text-align:center;">' + cur.format(totalAmount.totalHt)+'</td>'+
'<td id="tva" style="text-align:center;">' + totalAmount.tva + ' %</td>'+
@ -73,3 +76,28 @@ export function getTotalAmountOfOrder(orderId) {
'<td style="text-align:center;">' + cur.format(Math.round((totalAmount.totalHt * (totalAmount.tva + 100))) / 100) + '</td></tr>');
}));
}
/**
*
* @param {*} select
* @param {*} orderItemId
* @param {*} orderProductId
*/
export function loadOrderProductIntoSelect(selectSelector, orderItemId, orderProductId,orderId) {
$.ajax({
url: baseUrl + '/orderProduct/list',
type: 'PROPFIND',
contentType: 'application/json'
}).done(function (response) {
selectSelector.append('<option data-table="order_item" data-column="fk_order_item_id" data-val="' + orderProductId + '" data-id="' + orderItemId + '">'+t('gestion','Cancel')+'</option>');
$.each(JSON.parse(response), function (arrayID, myresp) {
var selected = "";
if (orderProductId == myresp.id) {
selected = "selected";
}
selectSelector.append('<option ' + selected + ' data-table="order_item" data-column="fk_order_item_id" data-order-id="' + orderId + '" data-val="' + myresp.id + '" data-id="' + orderItemId + '">' + myresp.reference + '</option>');
});
}).fail(function (response, code) {
showError(response);
});
}

View File

@ -4,11 +4,21 @@ import "../css/mycss.css";
import { globalConfiguration } from "./modules/mainFunction.mjs";
import "./listener/main_listener";
import "./listener/orderListener";
import { getOrderProductsByOrderId } from "./modules/order/orderAjaxRequest.mjs";
import { getProduitsByDevisId } from "./modules/ajaxRequest.mjs";
import { getOrderItemsByOrderId } from "./modules/order/orderAjaxRequest.mjs";
window.addEventListener("DOMContentLoaded", function () {
globalConfiguration();
const orderId = $("#orderId").data("id");
getOrderProductsByOrderId(orderId);
const devisId = $("#devisId").data("id");
console.log(devisId);
const isOrderDevis = devisId != null;
if(isOrderDevis){
getProduitsByDevisId(devisId);
}
else{
getOrderItemsByOrderId(orderId);
}
});

View File

@ -1,12 +1,48 @@
<?php
use OCA\Gestion\Constants\OrderTypeConstant;
$order = $_['order'];
$configuration = $_['configuration'];
$isOrderDevis = $order->fk_order_type_key == OrderTypeConstant::ORDER_TYPE_DEVIS;
$isOrderPurchase = $order->fk_order_type_key == OrderTypeConstant::ORDER_TYPE_PURCHASE;
$orderComment = $order->order_comment == null || $order->order_comment == "" ? "-": $order->order_comment;
$clientCompany = $isOrderDevis ?
$order->client_entreprise :
"FOURNISSEUR";
$clientFullName = $isOrderDevis ?
$order->client_prenom . " " . $order->client_nom :
$order->provider_name . " " . $order->provider_last_name;
$clientAddress = $isOrderDevis ?
$order->client_adresse :
$order->provider_address.' '.$order->provider_city;
$clientEmail = $isOrderDevis ?
$order->client_mail :
$order->provider_email;
$clientPhone = $isOrderDevis ?
$order->client_phone :
$order->provider_phone;
$clientSiret = $isOrderDevis ?
$order->client_legal_one :
$order->provider_company_name;
?>
<div class="bootstrap-iso">
<div id="orderId" data-id="<?php echo $order->id; ?>"></div>
<?php if($isOrderDevis){
?>
<div id="devisId" style="display:none;" data-id="<?php echo $order->fk_devis_id; ?>"></div>
<?php } ?>
<h2 class="mt-3 mb-3 text-center"> <?php p($l->t('Commande'));?>
<div id="orderId" style="display:inline" data-id="<?php echo $order->id; ?>">sur le defunt <?php echo $order->defunt_nom; ?></div>
<span>(</span> <div style="display:inline"><?php echo $order->lieu_nom; ?>)</div>
<?php if($isOrderDevis) {
?>
<div style="display:inline">sur le defunt <?php echo $order->defunt_nom; ?></div>
<span>(</span> <div style="display:inline"><?php echo $order->lieu_nom; ?>)</div>
<?php } ?>
</h2>
<hr />
<div class="row">
@ -30,16 +66,18 @@
?>
</div>
<div class="col-5 h-100 m-0" style="min-height:250px;">
<h5 class="p-3 m-0 text-dark text-center border border-2 border-dark"><?php p($l->t('TO'));?> <span><?php echo $order->client_entreprise; ?></span></h5>
<h5 class="p-3 m-0 text-dark text-center border border-2 border-dark"><?php p($l->t('TO'));?> <span><?php echo $clientCompany; ?></span></h5>
<p style="min-height:180px;" class="p-3 m-0 h-100 text-center text-dark text-center border border-top-0 border-2 border-dark">
<span><?php echo $order->client_prenom . " " . $order->client_nom; ?></span><br/>
<span><?php echo $order->client_adresse; ?></span><br/>
<span><?php echo $order->client_mail; ?></span><br/>
<span><?php echo $order->client_phone; ?></span><br/>
<span><?php echo $order->client_legal_one; ?></span><br/>
<span><?php echo $clientFullName; ?></span><br/>
<span><?php echo $clientAddress; ?></span><br/>
<span><?php echo $clientEmail; ?></span><br/>
<span><?php echo $clientPhone; ?></span><br/>
<span><?php echo $clientSiret; ?></span><br/>
</p>
</div>
</div>
<?php if($isOrderDevis){
?>
<div class="row">
<div class="col col-md">
<div class="col col-xl text-center">
@ -47,8 +85,9 @@
<span>Lieu : <b><?php echo $order->lieu_nom;?> (<?php echo $order->lieu_adresse;?>)</b>
</div>
</div>
<hr/>
</div>
<?php } ?>
<hr/>
<div class="row">
<div class="col col-md">
<label class="fw-bold">Commentaires :</label>
@ -63,11 +102,20 @@
</div>
<div class="d-flex justify-content-between align-items-center">
<div><h2>Articles</h2></div>
<button id="addProductToOrder" type="button" class="mb-2 btn btn-outline-success">Ajouter un article</button>
<?php if($isOrderPurchase){?>
<button id="addOrderItems" type="button" class="mb-2 btn btn-outline-success">Ajouter un article</button>
<?php
}
?>
</div>
<hr>
<div class="table-responsive">
<table id="orderProducts" class="table table-striped">
<?php
$tableProductId = $isOrderDevis ?
"produits" :
"orderItems";
?>
<table id="<?php echo $tableProductId ?>" class="table table-striped">
<thead>
<tr>
<th><?php p($l->t('Reference'));?></th>
@ -86,7 +134,12 @@
<button id="exportOrderToPdf" type="button" class="mb-2 btn btn-outline-success"><?php p($l->t('Save in Nextcloud'));?></button>
</div>
<div class="mt-0 table-responsive">
<table id="totalOrderProducts" class="table table-striped table-xl">
<?php
$tableTotalProductAmountId = $isOrderDevis?
"totaldevis" :
"totalOrderItems";
?>
<table id="<?php echo $tableTotalProductAmountId ?>" class="table table-striped table-xl">
<thead class="bg-dark text-white">
<tr>
<th class="text-center"><?php p($l->t('Total without VAT'));?></th>