mirror of https://github.com/jeecgboot/jeecg-boot
Merge pull request #176 from LQYBill/feat/complete-invoice-detail-download
download complete invoice details including purchase feepull/8547/head
commit
172fdb3115
|
@ -0,0 +1,49 @@
|
||||||
|
CREATE OR REPLACE VIEW detail_de_facture_avec_frais_achat AS
|
||||||
|
SELECT
|
||||||
|
s.name AS `Boutique`,
|
||||||
|
po.platform_order_id AS `N° de Mabang`,
|
||||||
|
po.platform_order_number AS `N° de commande`,
|
||||||
|
po.tracking_number AS `N° de suivi`,
|
||||||
|
po.order_time AS `Date de commande`,
|
||||||
|
po.shipping_time AS `Date d'expédition`,
|
||||||
|
po.recipient AS `Nom de client`,
|
||||||
|
po.country AS `Pays`,
|
||||||
|
po.postcode AS `Code postal`,
|
||||||
|
JSON_ARRAYAGG(sku.erp_code) AS `SKU`,
|
||||||
|
JSON_ARRAYAGG(sku.en_name) AS `Nom produits`,
|
||||||
|
JSON_ARRAYAGG(poc.quantity) AS `Quantité`,
|
||||||
|
|
||||||
|
-- Calculate purchase fees, using the price from sku_price if purchase_fee is 0
|
||||||
|
COALESCE(SUM(
|
||||||
|
CASE
|
||||||
|
WHEN poc.purchase_fee = 0 THEN poc.quantity * COALESCE(
|
||||||
|
(
|
||||||
|
SELECT sp.price
|
||||||
|
FROM sku_price sp
|
||||||
|
WHERE sp.sku_id = poc.sku_id
|
||||||
|
AND sp.date <= po.order_time
|
||||||
|
ORDER BY sp.date DESC
|
||||||
|
LIMIT 1
|
||||||
|
), 0
|
||||||
|
)
|
||||||
|
ELSE poc.purchase_fee
|
||||||
|
END
|
||||||
|
), 0) AS `Frais d'achat`,
|
||||||
|
|
||||||
|
po.fret_fee AS `Frais de FRET`,
|
||||||
|
SUM(poc.shipping_fee) AS `Frais de livraison`,
|
||||||
|
(po.order_service_fee + SUM(poc.service_fee)) AS `Frais de service`,
|
||||||
|
(po.picking_fee + SUM(poc.picking_fee)) AS `Frais de préparation`,
|
||||||
|
po.packaging_material_fee AS `Frais de matériel d'emballage`,
|
||||||
|
COALESCE(po.insurance_fee, 0.00) AS `Frais d'assurance produits`,
|
||||||
|
SUM(poc.vat) AS `TVA`,
|
||||||
|
po.shipping_invoice_number AS `N° de facture`
|
||||||
|
FROM platform_order po
|
||||||
|
JOIN shop s ON po.shop_id = s.id
|
||||||
|
RIGHT JOIN platform_order_content poc ON po.id = poc.platform_order_id
|
||||||
|
JOIN sku ON poc.sku_id = sku.id
|
||||||
|
WHERE po.order_time > '2025-01-01'
|
||||||
|
AND shipping_invoice_number IS NOT NULL
|
||||||
|
AND poc.erp_status <> 5
|
||||||
|
GROUP BY po.id, s.name, po.order_time
|
||||||
|
ORDER BY s.name, po.order_time;
|
|
@ -659,6 +659,15 @@ public class InvoiceController {
|
||||||
return shippingInvoiceService.exportToExcel(invoiceDetails, Collections.emptyList(), Collections.emptyList(), period, client.getInvoiceEntity(), client.getInternalCode());
|
return shippingInvoiceService.exportToExcel(invoiceDetails, Collections.emptyList(), Collections.emptyList(), period, client.getInvoiceEntity(), client.getInternalCode());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetMapping(value = "/downloadCompleteInvoiceDetail")
|
||||||
|
public byte[] downloadCompleteInvoiceDetail(@RequestParam("invoiceNumber") String invoiceNumber, @RequestParam("invoiceEntity") String invoiceEntity, @RequestParam("internalCode") String internalCode) throws IOException {
|
||||||
|
List<FactureDetail> factureDetails = shippingInvoiceService.getInvoiceDetailWithPurchaseFee(invoiceNumber);
|
||||||
|
List<SavRefundWithDetail> refunds = savRefundWithDetailService.getRefundsByInvoiceNumber(invoiceNumber);
|
||||||
|
List<ExtraFeeResult> extraFees = extraFeeService.findByInvoiceNumber(invoiceNumber);
|
||||||
|
String fileNameInfo = invoiceNumber + "_complete";
|
||||||
|
return shippingInvoiceService.exportToExcel(factureDetails, refunds, extraFees, fileNameInfo, invoiceEntity, internalCode);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Only downloads the inventory of skus that are in the invoice
|
* Only downloads the inventory of skus that are in the invoice
|
||||||
* Whereas downloadInventory downloads the inventory of a list of skus for the client
|
* Whereas downloadInventory downloads the inventory of a list of skus for the client
|
||||||
|
|
|
@ -10,5 +10,7 @@ import java.util.List;
|
||||||
@Repository
|
@Repository
|
||||||
public interface FactureDetailMapper extends BaseMapper<FactureDetail> {
|
public interface FactureDetailMapper extends BaseMapper<FactureDetail> {
|
||||||
|
|
||||||
|
List<FactureDetail> getInvoiceDetailWithPurchaseFee(@Param("invoiceNumber") String invoiceNumber);
|
||||||
|
|
||||||
List<FactureDetail> selectByShopsAndPeriod(@Param("shopIds") List<String> shopIds, @Param("start") String startDate, @Param("end") String endDate, @Param("type") String type);
|
List<FactureDetail> selectByShopsAndPeriod(@Param("shopIds") List<String> shopIds, @Param("start") String startDate, @Param("end") String endDate, @Param("type") String type);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
<mapper namespace="org.jeecg.modules.business.mapper.FactureDetailMapper">
|
<mapper namespace="org.jeecg.modules.business.mapper.FactureDetailMapper">
|
||||||
|
<select id="getInvoiceDetailWithPurchaseFee" resultType="org.jeecg.modules.business.vo.FactureDetail">
|
||||||
|
SELECT * FROM detail_de_facture_avec_frais_achat
|
||||||
|
WHERE `N° de facture` = #{invoiceNumber}
|
||||||
|
</select>
|
||||||
|
|
||||||
<select id="selectByShopsAndPeriod" resultType="org.jeecg.modules.business.vo.FactureDetail">
|
<select id="selectByShopsAndPeriod" resultType="org.jeecg.modules.business.vo.FactureDetail">
|
||||||
WITH LatestPrices AS (
|
WITH LatestPrices AS (
|
||||||
SELECT sp.sku_id, sp.price, sp.date
|
SELECT sp.sku_id, sp.price, sp.date
|
||||||
|
|
|
@ -117,6 +117,8 @@ public class PlatformOrderShippingInvoiceService {
|
||||||
|
|
||||||
@Value("${jeecg.path.shippingInvoiceDetailDir}")
|
@Value("${jeecg.path.shippingInvoiceDetailDir}")
|
||||||
private String INVOICE_DETAIL_DIR;
|
private String INVOICE_DETAIL_DIR;
|
||||||
|
@Value("${jeecg.path.shippingInvoiceDetailCompleteDir}")
|
||||||
|
private String INVOICE_DETAIL_COMPLETE_DIR;
|
||||||
@Value("${jeecg.path.shippingInvoicePdfDir}")
|
@Value("${jeecg.path.shippingInvoicePdfDir}")
|
||||||
private String INVOICE_PDF_DIR;
|
private String INVOICE_PDF_DIR;
|
||||||
@Value("${jeecg.path.shippingInvoiceDetailPdfDir}")
|
@Value("${jeecg.path.shippingInvoiceDetailPdfDir}")
|
||||||
|
@ -388,6 +390,15 @@ public class PlatformOrderShippingInvoiceService {
|
||||||
return factureDetailMapper.selectList(queryWrapper);
|
return factureDetailMapper.selectList(queryWrapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<FactureDetail> getInvoiceDetailWithPurchaseFee(String invoiceNumber) {
|
||||||
|
|
||||||
|
QueryWrapper<FactureDetail> queryWrapper = new QueryWrapper<>();
|
||||||
|
queryWrapper.eq("`N° de facture`", invoiceNumber);
|
||||||
|
|
||||||
|
return factureDetailMapper.getInvoiceDetailWithPurchaseFee(invoiceNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public List<FactureDetail> getInvoiceDetailByShopsAndPeriod(List<String> shopIds, String startDate, String endDate, String type) throws UserException {
|
public List<FactureDetail> getInvoiceDetailByShopsAndPeriod(List<String> shopIds, String startDate, String endDate, String type) throws UserException {
|
||||||
if(!type.equals(String.valueOf(SHIPPING.getType())) && !type.equals(String.valueOf(COMPLETE.getType())))
|
if(!type.equals(String.valueOf(SHIPPING.getType())) && !type.equals(String.valueOf(COMPLETE.getType())))
|
||||||
throw new UserException("Invalid invoice type");
|
throw new UserException("Invalid invoice type");
|
||||||
|
@ -505,7 +516,14 @@ public class PlatformOrderShippingInvoiceService {
|
||||||
sheetManager.moveCol(0);
|
sheetManager.moveCol(0);
|
||||||
sheetManager.nextRow();
|
sheetManager.nextRow();
|
||||||
}
|
}
|
||||||
String dir = Invoice.isInvoiceNumber(fileNameInfo) ? INVOICE_DETAIL_DIR : INVOICE_DETAIL_EXPORT_DIR;
|
String dir;
|
||||||
|
if (fileNameInfo.contains("complete")) {
|
||||||
|
dir = INVOICE_DETAIL_COMPLETE_DIR;
|
||||||
|
} else if (Invoice.isInvoiceNumber(fileNameInfo)) {
|
||||||
|
dir = INVOICE_DETAIL_DIR;
|
||||||
|
} else {
|
||||||
|
dir = INVOICE_DETAIL_EXPORT_DIR;
|
||||||
|
}
|
||||||
Path target = Paths.get(dir, internalCode + "_(" + invoiceEntity + ")_" + fileNameInfo + "_Détail_calcul_de_facture.xlsx");
|
Path target = Paths.get(dir, internalCode + "_(" + invoiceEntity + ")_" + fileNameInfo + "_Détail_calcul_de_facture.xlsx");
|
||||||
int i = 2;
|
int i = 2;
|
||||||
while (Files.exists(target)) {
|
while (Files.exists(target)) {
|
||||||
|
@ -782,6 +800,10 @@ public class PlatformOrderShippingInvoiceService {
|
||||||
log.info("File asked is of type invoice detail");
|
log.info("File asked is of type invoice detail");
|
||||||
pathList = getPath(INVOICE_DETAIL_DIR, invoiceNumber);
|
pathList = getPath(INVOICE_DETAIL_DIR, invoiceNumber);
|
||||||
}
|
}
|
||||||
|
if (filetype.equals("completeDetail")) {
|
||||||
|
log.info("File asked is of type complete invoice detail");
|
||||||
|
pathList = getPath(INVOICE_DETAIL_COMPLETE_DIR, invoiceNumber);
|
||||||
|
}
|
||||||
if(filetype.equals("inventory")) {
|
if(filetype.equals("inventory")) {
|
||||||
log.info("File asked is of type inventory");
|
log.info("File asked is of type inventory");
|
||||||
pathList = getPath(PURCHASE_INVENTORY_DIR, invoiceNumber);
|
pathList = getPath(PURCHASE_INVENTORY_DIR, invoiceNumber);
|
||||||
|
@ -805,6 +827,14 @@ public class PlatformOrderShippingInvoiceService {
|
||||||
List<ExtraFeeResult> extraFees = extraFeeService.findByInvoiceNumber(invoiceNumber);
|
List<ExtraFeeResult> extraFees = extraFeeService.findByInvoiceNumber(invoiceNumber);
|
||||||
exportToExcel(details, refunds, extraFees, invoiceNumber, client.getInvoiceEntity(), client.getInternalCode());
|
exportToExcel(details, refunds, extraFees, invoiceNumber, client.getInvoiceEntity(), client.getInternalCode());
|
||||||
pathList = getPath(INVOICE_DETAIL_DIR, invoiceNumber);
|
pathList = getPath(INVOICE_DETAIL_DIR, invoiceNumber);
|
||||||
|
} else if (filetype.equals("completeDetail")) {
|
||||||
|
Client client = clientService.getClientFromInvoice(invoiceNumber);
|
||||||
|
List<FactureDetail> details = getInvoiceDetailWithPurchaseFee(invoiceNumber);
|
||||||
|
List<SavRefundWithDetail> refunds = savRefundWithDetailService.getRefundsByInvoiceNumber(invoiceNumber);
|
||||||
|
List<ExtraFeeResult> extraFees = extraFeeService.findByInvoiceNumber(invoiceNumber);
|
||||||
|
String fileNameInfo = invoiceNumber + "_complete";
|
||||||
|
exportToExcel(details, refunds, extraFees, fileNameInfo, client.getInvoiceEntity(), client.getInternalCode());
|
||||||
|
pathList = getPath(INVOICE_DETAIL_COMPLETE_DIR, invoiceNumber);
|
||||||
} else if (filetype.equals("inventory")) {
|
} else if (filetype.equals("inventory")) {
|
||||||
InvoiceMetaData metaData = purchaseOrderService.getMetaDataFromInvoiceNumbers(invoiceNumber);
|
InvoiceMetaData metaData = purchaseOrderService.getMetaDataFromInvoiceNumbers(invoiceNumber);
|
||||||
List<SkuOrderPage> skuOrderPages = skuService.getInventoryByInvoiceNumber(metaData.getInvoiceCode());
|
List<SkuOrderPage> skuOrderPages = skuService.getInventoryByInvoiceNumber(metaData.getInvoiceCode());
|
||||||
|
|
Loading…
Reference in New Issue