Advertisement
aadddrr

FindOverCreditLimitAmountForSoApproval

Dec 6th, 2017
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 27.56 KB | None | 0 0
  1. package org.jleaf.erp.sls.bo.salesorder;
  2.  
  3. import javax.persistence.Query;
  4.  
  5. import org.jleaf.core.AbstractBusinessFunction;
  6. import org.jleaf.core.BusinessFunction;
  7. import org.jleaf.core.Dto;
  8. import org.jleaf.core.GeneralConstants;
  9. import org.jleaf.core.annotation.ErrorList;
  10. import org.jleaf.core.annotation.Info;
  11. import org.jleaf.core.annotation.InfoIn;
  12. import org.jleaf.core.annotation.InfoOut;
  13. import org.jleaf.core.dao.QueryBuilder;
  14. import org.jleaf.erp.inv.InventoryConstants;
  15. import org.jleaf.erp.inv.dao.DeliveryOrderReceiptDao;
  16. import org.jleaf.erp.inv.dao.InventoryDao;
  17. import org.jleaf.erp.inv.entity.BalanceDeliveryOrderItem;
  18. import org.jleaf.erp.inv.entity.DeliveryOrderReceipt;
  19. import org.jleaf.erp.inv.entity.DeliveryOrderReceiptItem;
  20. import org.jleaf.erp.inv.entity.Inventory;
  21. import org.jleaf.erp.inv.entity.InventoryItem;
  22. import org.jleaf.erp.master.entity.PartnerType;
  23. import org.jleaf.erp.master.entity.Tax;
  24. import org.jleaf.erp.sls.SalesConstants;
  25. import org.jleaf.erp.sls.SalesConstantsForXcom;
  26. import org.jleaf.erp.sls.dao.DeliveryOrderDao;
  27. import org.jleaf.erp.sls.dao.SalesOrderBalanceInvoiceDao;
  28. import org.jleaf.erp.sls.dao.SalesOrderBalanceInvoiceTaxDao;
  29. import org.jleaf.erp.sls.dao.SalesOrderDao;
  30. import org.jleaf.erp.sls.entity.DeliveryOrder;
  31. import org.jleaf.erp.sls.entity.DeliveryOrderItem;
  32. import org.jleaf.erp.sls.entity.SalesOrder;
  33. import org.jleaf.erp.sls.entity.SalesOrderBalanceInvoice;
  34. import org.jleaf.erp.sls.entity.SalesOrderBalanceInvoiceTax;
  35. import org.jleaf.erp.sls.entity.SalesOrderBalanceItem;
  36. import org.jleaf.erp.sls.entity.SalesOrderItem;
  37. import org.jleaf.util.Calc;
  38. import org.jleaf.util.ValidationUtil;
  39. import org.springframework.beans.factory.annotation.Autowired;
  40. import org.springframework.stereotype.Service;
  41.  
  42. /**
  43.  *
  44.  * @author Adrian
  45.  * Apr 3, 2017
  46.  */
  47. /**
  48.  * Menambahkan perhitungan:
  49.  * - nilai AR saat ini
  50.  * - nilai outstanding AR
  51.  * - nilai SO yang belum di-DO
  52.  * - nilai SO yang sedang dibuat saat ini
  53.  * modified by Adrian
  54.  * Dec 6, 2017
  55.  */
  56.  
  57. //@formatter:off
  58. @Service
  59. @InfoIn(value = {
  60.         @Info(name = "tenantId", description = "tenant id", type = Long.class),
  61.         @Info(name = "ouId", description = "ou id", type = Long.class),
  62.         @Info(name = "partnerId", description = "partner id", type = Long.class)
  63. })
  64. @InfoOut(value = {
  65.         @Info(name = "overCreditLimitAmount", description = "over credit limit amount", type = Double.class) })
  66. @ErrorList(errorKeys = {
  67.  
  68. })
  69. //@formatter:on
  70. public class FindOverCreditLimitAmountForSoApproval extends AbstractBusinessFunction implements BusinessFunction {
  71.    
  72.     @Autowired
  73.     SalesOrderDao salesOrderDao;
  74.    
  75.     @Autowired
  76.     SalesOrderBalanceInvoiceDao salesOrderBalanceInvoiceDao;
  77.    
  78.     @Autowired
  79.     SalesOrderBalanceInvoiceTaxDao salesOrderBalanceInvoiceTaxDao;
  80.    
  81.     @Autowired
  82.     DeliveryOrderDao deliveryOrderDao;
  83.    
  84.     @Autowired
  85.     DeliveryOrderReceiptDao deliveryOrderReceiptDao;
  86.  
  87.     @Autowired
  88.     InventoryDao inventoryDao;
  89.  
  90.     public String getDescription() {
  91.         // write description of this business function here
  92.         return "find over credit limit amount";
  93.     }
  94.  
  95.     @SuppressWarnings("unchecked")
  96.     public Dto execute(Dto inputDto) throws Exception {
  97.         // validate inputDto have key in @InfoIn
  98.         ValidationUtil.valDtoContainsKey(inputDto, "tenantId");
  99.         ValidationUtil.valDtoContainsKey(inputDto, "ouId");
  100.         ValidationUtil.valDtoContainsKey(inputDto, "partnerId");
  101.  
  102.         // @formatter:off
  103.         // create native sql
  104.         // Mendapatkan limit customer
  105.         // dan mengurangkannya dengan nilai AR saat ini
  106.         QueryBuilder builder = new QueryBuilder();
  107.         builder.add(" WITH os_invoice AS ( ")
  108.                 .add(" SELECT COALESCE(SUM(A.amount - A.payment_amount), 0) AS os_amount FROM ")
  109.                 .add(SalesConstantsForXcom.INVOICE_AR_BALANCE_TABLE_NAME)
  110.                 .add(" A LEFT OUTER JOIN ")
  111.                 .add(SalesOrder.TABLE_NAME)
  112.                 .add(" B ON A.ref_doc_type_id = B.doc_type_id AND A.ref_id = B.so_id ")  
  113.                 .add(" WHERE A.tenant_id = :tenantId ")
  114.                 .add(" AND A.ou_id = :ouId ")
  115.                 .add(" AND A.partner_id = :partnerId ")
  116.                 .add(" AND A.due_date BETWEEN :startDate AND :endDate ")
  117.                 .add(" AND A.flg_payment = :NO )")
  118.                 .add(" SELECT (A.amount_limit - B.os_amount) FROM ")
  119.                 .add(PartnerType.TABLE_NAME)
  120.                 .add(" A, os_invoice B ")
  121.                 .add(" WHERE A.partner_id = :partnerId ")
  122.                 .add(" AND A.group_partner = :CUSTOMER ");
  123.         // @formatter:on
  124.        
  125.         // create native query
  126.         Query q = salesOrderDao.createNativeQuery(builder.toString());
  127.        
  128.         // set query parameter (if any)
  129.         q.setParameter("tenantId", inputDto.getLong("tenantId"));
  130.         q.setParameter("ouId", inputDto.getLong("ouId"));
  131.         q.setParameter("partnerId", inputDto.getLong("partnerId"));
  132.         q.setParameter("startDate", GeneralConstants.START_DATE);
  133.         q.setParameter("endDate", GeneralConstants.END_DATE);
  134.         q.setParameter("NO", GeneralConstants.NO);
  135.         q.setParameter("CUSTOMER", SalesConstantsForXcom.GROUP_PARTNER_CUSTOMER);
  136.        
  137.         Object amount = q.getSingleResult();
  138.        
  139.         // @formatter:off
  140.         // create native sql
  141.         // Mendapatkan nilai tax AR saat ini
  142.         QueryBuilder builderTax = new QueryBuilder();
  143.         builderTax.add(" SELECT COALESCE(SUM(A.gov_tax_amount - A.payment_amount), 0) AS os_amount FROM ")
  144.                 .add(SalesConstantsForXcom.INVOICE_TAX_AR_BALANCE_TABLE_NAME)
  145.                 .add(" A INNER JOIN ")
  146.                 .add(SalesConstantsForXcom.INVOICE_AR_BALANCE_TABLE_NAME)
  147.                 .add(" B ON A.invoice_ar_balance_id = B.invoice_ar_balance_id ")  
  148.                 .add(" WHERE A.tenant_id = :tenantId ")
  149.                 .add(" AND A.ou_id = :ouId ")
  150.                 .add(" AND A.partner_id = :partnerId ")
  151.                 .add(" AND A.due_date BETWEEN :startDate AND :endDate ")
  152.                 .add(" AND A.flg_payment = :NO ");
  153.         // @formatter:on
  154.        
  155.         // create native query
  156.         Query qTax = salesOrderDao.createNativeQuery(builderTax.toString());
  157.        
  158.         // set query parameter (if any)
  159.         qTax.setParameter("tenantId", inputDto.getLong("tenantId"));
  160.         qTax.setParameter("ouId", inputDto.getLong("ouId"));
  161.         qTax.setParameter("partnerId", inputDto.getLong("partnerId"));
  162.         qTax.setParameter("startDate", GeneralConstants.START_DATE);
  163.         qTax.setParameter("endDate", GeneralConstants.END_DATE);
  164.         qTax.setParameter("NO", GeneralConstants.NO);
  165.        
  166.         Object taxAmount = qTax.getSingleResult();
  167.        
  168.         // limit customer - nilai AR saat ini - nilai tax AR saat ini
  169.         Calc overCreditLimitAmount = new Calc(Double.valueOf(amount.toString())).subtract(Double.valueOf(taxAmount.toString()));
  170.  
  171.        
  172.         //Mendapatkan nilai outstanding AR (DO yang belum jadi invoice)
  173.         QueryBuilder builderOsAr = new QueryBuilder();
  174.         builderOsAr.add(" SELECT COALESCE(SUM(A.item_amount), 0) FROM ")
  175.                 .add(SalesOrderBalanceInvoice.TABLE_NAME)
  176.                 .add(" A ")
  177.                 .add(" WHERE A.tenant_id = :tenantId ")
  178.                 .add(" AND A.ou_id = :ouId ")
  179.                 .add(" AND A.partner_id = :partnerId ")
  180.                 .add(" AND A.flg_invoice = :NO ")
  181.                 .add(" AND A.invoice_id = :EMPTY_ID ");
  182.        
  183.         Query queryOsAr = salesOrderBalanceInvoiceDao.createNativeQuery(builderOsAr.toString());
  184.        
  185.         queryOsAr.setParameter("tenantId", inputDto.getLong("tenantId"));
  186.         queryOsAr.setParameter("ouId", inputDto.getLong("ouId"));
  187.         queryOsAr.setParameter("partnerId", inputDto.getLong("partnerId"));
  188.         queryOsAr.setParameter("NO", GeneralConstants.NO);
  189.         queryOsAr.setParameter("EMPTY_ID", GeneralConstants.NULL_REF_VALUE_LONG);
  190.        
  191.         Object osArAmount = queryOsAr.getSingleResult();
  192.        
  193.         //over credit limit amount dikurangi dengan nilai outstanding AR
  194.         overCreditLimitAmount = overCreditLimitAmount.subtract(Double.valueOf(osArAmount.toString()));
  195.        
  196.        
  197.         //Mendapatkan nilai tax outstanding AR (DO yang belum jadi invoice)
  198.         QueryBuilder builderOsArTax = new QueryBuilder();
  199.         builderOsArTax.add(" SELECT COALESCE(SUM(A.tax_amount), 0) FROM ")
  200.                 .add(SalesOrderBalanceInvoiceTax.TABLE_NAME)
  201.                 .add(" A ")
  202.                 .add(" WHERE A.tenant_id = :tenantId ")
  203.                 .add(" AND A.ou_id = :ouId ")
  204.                 .add(" AND A.partner_id = :partnerId ")
  205.                 .add(" AND A.flg_invoice = :NO ")
  206.                 .add(" AND A.invoice_id = :EMPTY_ID ");
  207.        
  208.         Query queryOsArTax = salesOrderBalanceInvoiceTaxDao.createNativeQuery(builderOsArTax.toString());
  209.        
  210.         queryOsArTax.setParameter("tenantId", inputDto.getLong("tenantId"));
  211.         queryOsArTax.setParameter("ouId", inputDto.getLong("ouId"));
  212.         queryOsArTax.setParameter("partnerId", inputDto.getLong("partnerId"));
  213.         queryOsArTax.setParameter("NO", GeneralConstants.NO);
  214.         queryOsArTax.setParameter("EMPTY_ID", GeneralConstants.NULL_REF_VALUE_LONG);
  215.        
  216.         Object osArTaxAmount = queryOsArTax.getSingleResult();
  217.        
  218.         //over credit limit amount dikurangi dengan nilai tax outstanding AR
  219.         overCreditLimitAmount = overCreditLimitAmount.subtract(Double.valueOf(osArTaxAmount.toString()));
  220.        
  221.        
  222.         //Mendapatkan nilai outstanding AR (DO yang belum APPROVED)
  223.         QueryBuilder builderOsArNotApprovedDo = new QueryBuilder();
  224.         builderOsArNotApprovedDo.add(" SELECT COALESCE(SUM( ")
  225.                     .add(" f_get_amount_before_tax_and_disc( ")
  226.                         .add(" B.qty_dlv_so * C.gross_sell_price, ")
  227.                         .add(" B.qty_dlv_so * C.discount_amount, ")
  228.                         .add(" C.flg_tax_amount, ")
  229.                         .add(" C.tax_percentage, ")
  230.                         .add(" f_get_digit_decimal_doc_curr(:DO_DOC_TYPE_ID, C.curr_code), ")
  231.                         .add(" f_get_value_system_config_by_param_code(:tenantId, :ROUNDING_MODE_NON_TAX))), 0) ")
  232.                 .add(" FROM ")
  233.                 .add(DeliveryOrder.TABLE_NAME)
  234.                 .add(" A ")
  235.                 .add(" INNER JOIN ")
  236.                 .add(DeliveryOrderItem.TABLE_NAME)
  237.                 .add(" B ON A.do_id = B.do_id ")
  238.                 .add(" INNER JOIN ")
  239.                 .add(SalesOrderItem.TABLE_NAME)
  240.                 .add(" C ON B.ref_id = C.so_item_id ")
  241.                 .add(" INNER JOIN ")
  242.                 .add(SalesOrder.TABLE_NAME)
  243.                 .add(" D ON C.so_id = D.so_id ")
  244.                 .add(" WHERE A.tenant_id = :tenantId ")
  245.                 .add(" AND A.ou_id = :ouId ")
  246.                 .add(" AND D.partner_bill_to_id = :partnerId ")
  247.                 .add(" AND A.status_doc IN (:DRAFT, :IN_PROGRESS) ");
  248.        
  249.         Query queryOsArNotApprovedDo = deliveryOrderDao.createNativeQuery(builderOsArNotApprovedDo.toString());
  250.        
  251.         queryOsArNotApprovedDo.setParameter("tenantId", inputDto.getLong("tenantId"));
  252.         queryOsArNotApprovedDo.setParameter("ouId", inputDto.getLong("ouId"));
  253.         queryOsArNotApprovedDo.setParameter("partnerId", inputDto.getLong("partnerId"));
  254.         queryOsArNotApprovedDo.setParameter("DO_DOC_TYPE_ID", SalesConstants.DOCUMENT_DELIVERY_ORDER);
  255.         queryOsArNotApprovedDo.setParameter("ROUNDING_MODE_NON_TAX", "rounding.mode.non.tax");
  256.         queryOsArNotApprovedDo.setParameter("DRAFT", SalesConstants.DRAFT_TRANSACTION);
  257.         queryOsArNotApprovedDo.setParameter("IN_PROGRESS", SalesConstants.IN_PROGRESS_TRANSACTION);
  258.        
  259.         Object osArNotApprovedDoAmount = queryOsArNotApprovedDo.getSingleResult();
  260.        
  261.         //over credit limit amount dikurangi dengan nilai outstanding AR (DO yang belum APPROVED)
  262.         overCreditLimitAmount = overCreditLimitAmount.subtract(Double.valueOf(osArNotApprovedDoAmount.toString()));
  263.        
  264.        
  265.         //Mendapatkan nilai tax outstanding AR (DO yang belum APPROVED)
  266.         QueryBuilder builderOsArTaxNotApprovedDo = new QueryBuilder();
  267.         builderOsArTaxNotApprovedDo.add(" SELECT COALESCE(SUM( ")
  268.                 .add(" f_tax_rounding( ")
  269.                         .add(" A.tenant_id, ")
  270.                         .add(" f_get_amount_before_tax( ")
  271.                                 .add(" B.qty_dlv_so * (C.gross_sell_price - C.discount_amount), ")
  272.                                 .add(" C.flg_tax_amount, ")
  273.                                 .add(" C.tax_percentage, ")
  274.                                 .add(" f_get_digit_decimal_doc_curr(:DO_DOC_TYPE_ID, C.curr_code), ")
  275.                                 .add(" f_get_value_system_config_by_param_code(:tenantId, :ROUNDING_MODE_NON_TAX)), ")
  276.                         .add(" C.tax_percentage)), 0) ")
  277.                 .add(" FROM ")
  278.                 .add(DeliveryOrder.TABLE_NAME)
  279.                 .add(" A ")
  280.                 .add(" INNER JOIN ")
  281.                 .add(DeliveryOrderItem.TABLE_NAME)
  282.                 .add(" B ON A.do_id = B.do_id ")
  283.                 .add(" INNER JOIN ")
  284.                 .add(SalesOrderItem.TABLE_NAME)
  285.                 .add(" C ON B.ref_id = C.so_item_id ")
  286.                 .add(" INNER JOIN ")
  287.                 .add(Tax.TABLE_NAME)
  288.                 .add(" D ON C.tax_id = D.tax_id ")
  289.                 .add(" INNER JOIN ")
  290.                 .add(SalesOrder.TABLE_NAME)
  291.                 .add(" E ON C.so_id = E.so_id ")
  292.                 .add(" WHERE A.tenant_id = :tenantId ")
  293.                 .add(" AND A.ou_id = :ouId ")
  294.                 .add(" AND E.partner_bill_to_id = :partnerId ")
  295.                 .add(" AND A.status_doc IN (:DRAFT, :IN_PROGRESS) ");
  296.        
  297.         Query queryOsArTaxNotApprovedDo = deliveryOrderDao.createNativeQuery(builderOsArTaxNotApprovedDo.toString());
  298.        
  299.         queryOsArTaxNotApprovedDo.setParameter("tenantId", inputDto.getLong("tenantId"));
  300.         queryOsArTaxNotApprovedDo.setParameter("ouId", inputDto.getLong("ouId"));
  301.         queryOsArTaxNotApprovedDo.setParameter("partnerId", inputDto.getLong("partnerId"));
  302.         queryOsArTaxNotApprovedDo.setParameter("DO_DOC_TYPE_ID", SalesConstants.DOCUMENT_DELIVERY_ORDER);
  303.         queryOsArTaxNotApprovedDo.setParameter("ROUNDING_MODE_NON_TAX", "rounding.mode.non.tax");
  304.         queryOsArTaxNotApprovedDo.setParameter("DRAFT", SalesConstants.DRAFT_TRANSACTION);
  305.         queryOsArTaxNotApprovedDo.setParameter("IN_PROGRESS", SalesConstants.IN_PROGRESS_TRANSACTION);
  306.        
  307.         Object osArTaxNotApprovedDoAmount = queryOsArTaxNotApprovedDo.getSingleResult();
  308.        
  309.         //over credit limit amount dikurangi dengan nilai tax outstanding AR (DO yang belum APPROVED)
  310.         overCreditLimitAmount = overCreditLimitAmount.subtract(Double.valueOf(osArTaxNotApprovedDoAmount.toString()));
  311.        
  312.        
  313.         //Mendapatkan nilai outstanding AR (DO Receipt yang belum APPROVED)
  314.         QueryBuilder builderOsArNotApprovedDoReceipt = new QueryBuilder();
  315.         builderOsArNotApprovedDoReceipt.add(" SELECT COALESCE(SUM( ")
  316.                     .add(" -1 * f_get_amount_before_tax_and_disc( ")
  317.                             .add(" (B.qty_return * D.qty_so / D.qty_int) * D.gross_sell_price, ")
  318.                             .add(" (G.regular_disc_amount + G.promo_disc_amount) * (B.qty_return * D.qty_so / D.qty_int) / G.qty_dlv_so, ")
  319.                             .add(" D.flg_tax_amount, ")
  320.                             .add(" D.tax_percentage, ")
  321.                             .add(" f_get_digit_decimal_doc_curr(:DO_RECEIPT_DOC_TYPE_ID, D.curr_code), ")
  322.                             .add(" f_get_value_system_config_by_param_code(:tenantId, :ROUNDING_MODE_NON_TAX))), 0) ")
  323.                 .add(" FROM ")
  324.                 .add(DeliveryOrderReceipt.TABLE_NAME)
  325.                 .add(" A ")
  326.                 .add(" INNER JOIN ")
  327.                 .add(DeliveryOrderReceiptItem.TABLE_NAME)
  328.                 .add(" B ON A.do_receipt_id = B.do_receipt_id ")
  329.                 .add(" INNER JOIN ")
  330.                 .add(BalanceDeliveryOrderItem.TABLE_NAME)
  331.                 .add(" C ON B.ref_id = C.do_item_id ")
  332.                 .add(" INNER JOIN ")
  333.                 .add(SalesOrderItem.TABLE_NAME)
  334.                 .add(" D ON C.so_item_id = D.so_item_id ")
  335.                 .add(" INNER JOIN ")
  336.                 .add(SalesOrder.TABLE_NAME)
  337.                 .add(" E ON D.so_id = E.so_id ")
  338.                 .add(" INNER JOIN ")
  339.                 .add(DeliveryOrder.TABLE_NAME)
  340.                 .add(" F ON A.ref_id = F.do_id ")
  341.                 .add(" INNER JOIN ")
  342.                 .add(SalesOrderBalanceInvoice.TABLE_NAME)
  343.                 .add(" G ON G.ref_id = F.do_id AND G.ref_item_id = C.do_item_id ")
  344.                 .add(" WHERE A.tenant_id = :tenantId ")
  345.                 .add(" AND A.ou_id = :ouId ")
  346.                 .add(" AND E.partner_bill_to_id = :partnerId ")
  347.                 .add(" AND A.status_doc IN (:DRAFT, :IN_PROGRESS) ")
  348.                 .add(" AND B.qty_return > 0 ")
  349.                 .add(" AND G.do_receipt_item_id = :EMPTY_ID ");
  350.        
  351.         Query queryOsArNotApprovedDoReceipt = deliveryOrderReceiptDao.createNativeQuery(builderOsArNotApprovedDoReceipt.toString());
  352.        
  353.         queryOsArNotApprovedDoReceipt.setParameter("tenantId", inputDto.getLong("tenantId"));
  354.         queryOsArNotApprovedDoReceipt.setParameter("ouId", inputDto.getLong("ouId"));
  355.         queryOsArNotApprovedDoReceipt.setParameter("partnerId", inputDto.getLong("partnerId"));
  356.         queryOsArNotApprovedDoReceipt.setParameter("DO_RECEIPT_DOC_TYPE_ID", InventoryConstants.DOCUMENT_DELIVERY_ORDER_RECEIPT);
  357.         queryOsArNotApprovedDoReceipt.setParameter("ROUNDING_MODE_NON_TAX", "rounding.mode.non.tax");
  358.         queryOsArNotApprovedDoReceipt.setParameter("DRAFT", SalesConstants.DRAFT_TRANSACTION);
  359.         queryOsArNotApprovedDoReceipt.setParameter("IN_PROGRESS", SalesConstants.IN_PROGRESS_TRANSACTION);
  360.         queryOsArNotApprovedDoReceipt.setParameter("EMPTY_ID", GeneralConstants.NULL_REF_VALUE_LONG);
  361.        
  362.         Object osArNotApprovedDoReceiptAmount = queryOsArNotApprovedDoReceipt.getSingleResult();
  363.        
  364.         //over credit limit amount dikurangi dengan nilai outstanding AR (DO Receipt yang belum APPROVED)
  365.         overCreditLimitAmount = overCreditLimitAmount.subtract(Double.valueOf(osArNotApprovedDoReceiptAmount.toString()));
  366.        
  367.  
  368.         //Mendapatkan nilai tax outstanding AR (DO Receipt yang belum APPROVED)
  369.         QueryBuilder builderOsArTaxNotApprovedDoReceipt = new QueryBuilder();
  370.         builderOsArTaxNotApprovedDoReceipt.add(" SELECT COALESCE(SUM( ")
  371.                     .add(" -1 * f_tax_rounding( ")
  372.                             .add(" A.tenant_id, ")
  373.                             .add(" f_get_amount_before_tax( ")
  374.                                 .add(" (B.qty_return * D.qty_so / D.qty_int) * (D.gross_sell_price - D.discount_amount), ")
  375.                                 .add(" D.flg_tax_amount, ")
  376.                                 .add(" D.tax_percentage, ")
  377.                                 .add(" f_get_digit_decimal_doc_curr(:DO_RECEIPT_DOC_TYPE_ID, D.curr_code), ")
  378.                                 .add(" f_get_value_system_config_by_param_code(:tenantId, :ROUNDING_MODE_NON_TAX)), ")
  379.                             .add(" D.tax_percentage)), 0) ")
  380.                 .add(" FROM ")
  381.                 .add(DeliveryOrderReceipt.TABLE_NAME)
  382.                 .add(" A ")
  383.                 .add(" INNER JOIN ")
  384.                 .add(DeliveryOrderReceiptItem.TABLE_NAME)
  385.                 .add(" B ON A.do_receipt_id = B.do_receipt_id ")
  386.                 .add(" INNER JOIN ")
  387.                 .add(BalanceDeliveryOrderItem.TABLE_NAME)
  388.                 .add(" C ON B.ref_id = C.do_item_id ")
  389.                 .add(" INNER JOIN ")
  390.                 .add(SalesOrderItem.TABLE_NAME)
  391.                 .add(" D ON C.so_item_id = D.so_item_id ")
  392.                 .add(" INNER JOIN ")
  393.                 .add(Tax.TABLE_NAME)
  394.                 .add(" E ON D.tax_id = E.tax_id ")
  395.                 .add(" INNER JOIN ")
  396.                 .add(SalesOrder.TABLE_NAME)
  397.                 .add(" F ON  D.so_id = F.so_id ")
  398.                 .add(" WHERE A.tenant_id = :tenantId ")
  399.                 .add(" AND A.ou_id = :ouId ")
  400.                 .add(" AND F.partner_bill_to_id = :partnerId ")
  401.                 .add(" AND A.status_doc IN (:DRAFT, :IN_PROGRESS) ")
  402.                 .add(" AND B.qty_return > 0 ");
  403.        
  404.         Query queryOsArTaxNotApprovedDoReceipt = deliveryOrderReceiptDao.createNativeQuery(builderOsArTaxNotApprovedDoReceipt.toString());
  405.        
  406.         queryOsArTaxNotApprovedDoReceipt.setParameter("tenantId", inputDto.getLong("tenantId"));
  407.         queryOsArTaxNotApprovedDoReceipt.setParameter("ouId", inputDto.getLong("ouId"));
  408.         queryOsArTaxNotApprovedDoReceipt.setParameter("partnerId", inputDto.getLong("partnerId"));
  409.         queryOsArTaxNotApprovedDoReceipt.setParameter("DO_RECEIPT_DOC_TYPE_ID", InventoryConstants.DOCUMENT_DELIVERY_ORDER_RECEIPT);
  410.         queryOsArTaxNotApprovedDoReceipt.setParameter("ROUNDING_MODE_NON_TAX", "rounding.mode.non.tax");
  411.         queryOsArTaxNotApprovedDoReceipt.setParameter("DRAFT", SalesConstants.DRAFT_TRANSACTION);
  412.         queryOsArTaxNotApprovedDoReceipt.setParameter("IN_PROGRESS", SalesConstants.IN_PROGRESS_TRANSACTION);
  413.        
  414.         Object osArTaxNotApprovedDoReceiptAmount = queryOsArTaxNotApprovedDoReceipt.getSingleResult();
  415.        
  416.         //over credit limit amount dikurangi dengan nilai tax outstanding AR (DO Receipt yang belum APPROVED)
  417.         overCreditLimitAmount = overCreditLimitAmount.subtract(Double.valueOf(osArTaxNotApprovedDoReceiptAmount.toString()));
  418.  
  419.        
  420.         //Mendapatkan nilai outstanding AR (Return Note yang belum APPROVED)
  421.         QueryBuilder builderOsArNotApprovedReturnNote = new QueryBuilder();
  422.         builderOsArNotApprovedReturnNote.add(" SELECT COALESCE(SUM( ")
  423.                     .add(" f_get_amount_before_tax_and_disc( ")
  424.                         .add(" (B.qty_realization * D.qty_so * D.gross_sell_price) / D.qty_int, ")
  425.                         .add(" (F.regular_disc_amount + F.promo_disc_amount) * (B.qty_realization * D.qty_so) / (D.qty_int / F.qty_dlv_so), ")
  426.                         .add(" D.flg_tax_amount, ")
  427.                         .add(" D.tax_percentage, ")
  428.                         .add(" f_get_digit_decimal_doc_curr(:RETURN_NOTE_DOC_TYPE_ID, D.curr_code), ")
  429.                         .add(" f_get_value_system_config_by_param_code(:tenantId, :ROUNDING_MODE_NON_TAX))), 0) ")
  430.                 .add(" FROM ")
  431.                 .add(Inventory.TABLE_NAME)
  432.                 .add(" A ")
  433.                 .add(" INNER JOIN ")
  434.                 .add(InventoryItem.TABLE_NAME)
  435.                 .add(" B ON A.inventory_id = B.inventory_id ")
  436.                 .add(" INNER JOIN ")
  437.                 .add(BalanceDeliveryOrderItem.TABLE_NAME)
  438.                 .add(" C ON B.ref_id = C.do_item_id ")
  439.                 .add(" INNER JOIN ")
  440.                 .add(SalesOrderItem.TABLE_NAME)
  441.                 .add(" D ON C.so_item_id = D.so_item_id ")
  442.                 .add(" INNER JOIN ")
  443.                 .add(SalesOrder.TABLE_NAME)
  444.                 .add(" E ON D.so_id = E.so_id ")
  445.                 .add(" INNER JOIN ")
  446.                 .add(SalesOrderBalanceInvoice.TABLE_NAME)
  447.                 .add(" F ON F.ref_id = B.ref_id AND F.ref_item_id = B.ref_item_id AND F.do_receipt_item_id = :EMPTY_ID ")
  448.                 .add(" WHERE A.tenant_id = :tenantId ")
  449.                 .add(" AND A.ou_from_id = :ouId ")
  450.                 .add(" AND E.partner_bill_to_id = :partnerId ")
  451.                 .add(" AND A.status_doc IN (:DRAFT, :IN_PROGRESS) ");
  452.        
  453.         Query queryOsArNotApprovedReturnNote = inventoryDao.createNativeQuery(builderOsArNotApprovedReturnNote.toString());
  454.        
  455.         queryOsArNotApprovedReturnNote.setParameter("tenantId", inputDto.getLong("tenantId"));
  456.         queryOsArNotApprovedReturnNote.setParameter("ouId", inputDto.getLong("ouId"));
  457.         queryOsArNotApprovedReturnNote.setParameter("partnerId", inputDto.getLong("partnerId"));
  458.         queryOsArNotApprovedReturnNote.setParameter("RETURN_NOTE_DOC_TYPE_ID", InventoryConstants.DOCUMENT_RETURN_NOTE);
  459.         queryOsArNotApprovedReturnNote.setParameter("ROUNDING_MODE_NON_TAX", "rounding.mode.non.tax");
  460.         queryOsArNotApprovedReturnNote.setParameter("DRAFT", SalesConstants.DRAFT_TRANSACTION);
  461.         queryOsArNotApprovedReturnNote.setParameter("IN_PROGRESS", SalesConstants.IN_PROGRESS_TRANSACTION);
  462.         queryOsArNotApprovedReturnNote.setParameter("EMPTY_ID", GeneralConstants.NULL_REF_VALUE_LONG);
  463.        
  464.         Object osArNotApprovedReturnNoteAmount = queryOsArNotApprovedReturnNote.getSingleResult();
  465.        
  466.         //over credit limit amount dikurangi dengan nilai outstanding AR (Return Note yang belum APPROVED)
  467.         overCreditLimitAmount = overCreditLimitAmount.subtract(Double.valueOf(osArNotApprovedReturnNoteAmount.toString()));
  468.  
  469.        
  470.         //Mendapatkan nilai tax outstanding AR (Return Note yang belum APPROVED)
  471.         QueryBuilder builderOsArTaxNotApprovedReturnNote = new QueryBuilder();
  472.         builderOsArTaxNotApprovedReturnNote.add(" SELECT COALESCE(SUM( ")
  473.                     .add(" f_tax_rounding( ")
  474.                         .add(" A.tenant_id, ")
  475.                         .add(" f_get_amount_before_tax( ")
  476.                             .add(" (B.qty_realization * D.qty_so * (D.gross_sell_price - G.discount_amount)) / D.qty_int, ")
  477.                             .add(" D.flg_tax_amount, ")
  478.                             .add(" D.tax_percentage, ")
  479.                             .add(" f_get_digit_decimal_doc_curr(:RETURN_NOTE_DOC_TYPE_ID, D.curr_code), ")
  480.                             .add(" f_get_value_system_config_by_param_code(:tenantId, :ROUNDING_MODE_NON_TAX)), ")
  481.                         .add(" D.tax_percentage)), 0) ")
  482.                 .add(" FROM ")
  483.                 .add(Inventory.TABLE_NAME)
  484.                 .add(" A ")
  485.                 .add(" INNER JOIN ")
  486.                 .add(InventoryItem.TABLE_NAME)
  487.                 .add(" B ON A.inventory_id = B.inventory_id ")
  488.                 .add(" INNER JOIN ")
  489.                 .add(BalanceDeliveryOrderItem.TABLE_NAME)
  490.                 .add(" C ON B.ref_id = C.do_item_id ")
  491.                 .add(" INNER JOIN ")
  492.                 .add(SalesOrderItem.TABLE_NAME)
  493.                 .add(" D ON C.so_item_id = D.so_item_id ")
  494.                 .add(" INNER JOIN ")
  495.                 .add(SalesOrder.TABLE_NAME)
  496.                 .add(" E ON D.so_id = E.so_id ")
  497.                 .add(" INNER JOIN ")
  498.                 .add(Tax.TABLE_NAME)
  499.                 .add(" F ON D.tax_id = F.tax_id ")
  500.                 .add(" INNER JOIN ")
  501.                 .add(SalesOrderItem.TABLE_NAME)
  502.                 .add(" G ON D.so_item_id = G.so_item_id ")
  503.                 .add(" WHERE A.tenant_id = :tenantId ")
  504.                 .add(" AND A.ou_from_id = :ouId ")
  505.                 .add(" AND E.partner_bill_to_id = :partnerId ")
  506.                 .add(" AND A.status_doc IN (:DRAFT, :IN_PROGRESS) ");
  507.        
  508.         Query queryOsArTaxNotApprovedReturnNote = inventoryDao.createNativeQuery(builderOsArTaxNotApprovedReturnNote.toString());
  509.        
  510.         queryOsArTaxNotApprovedReturnNote.setParameter("tenantId", inputDto.getLong("tenantId"));
  511.         queryOsArTaxNotApprovedReturnNote.setParameter("ouId", inputDto.getLong("ouId"));
  512.         queryOsArTaxNotApprovedReturnNote.setParameter("partnerId", inputDto.getLong("partnerId"));
  513.         queryOsArTaxNotApprovedReturnNote.setParameter("RETURN_NOTE_DOC_TYPE_ID", InventoryConstants.DOCUMENT_RETURN_NOTE);
  514.         queryOsArTaxNotApprovedReturnNote.setParameter("ROUNDING_MODE_NON_TAX", "rounding.mode.non.tax");
  515.         queryOsArTaxNotApprovedReturnNote.setParameter("DRAFT", SalesConstants.DRAFT_TRANSACTION);
  516.         queryOsArTaxNotApprovedReturnNote.setParameter("IN_PROGRESS", SalesConstants.IN_PROGRESS_TRANSACTION);
  517.        
  518.         Object osArTaxNotApprovedReturnNoteAmount = queryOsArTaxNotApprovedReturnNote.getSingleResult();
  519.        
  520.         //over credit limit amount dikurangi dengan nilai tax outstanding AR (Return Note yang belum APPROVED)
  521.         overCreditLimitAmount = overCreditLimitAmount.subtract(Double.valueOf(osArTaxNotApprovedReturnNoteAmount.toString()));
  522.        
  523.        
  524.         //Mendapatkan nilai SO yang belum di-DO
  525.         QueryBuilder builderOsSo = new QueryBuilder();
  526.         builderOsSo.add(" SELECT COALESCE(SUM((A.qty_so - A.qty_cancel + A.qty_add - A.qty_dlv) * (B.gross_sell_price - B.discount_amount)), 0)")
  527.                 .add(" FROM ")
  528.                 .add(SalesOrderBalanceItem.TABLE_NAME)
  529.                 .add(" A ")
  530.                 .add(" INNER JOIN ")
  531.                 .add(SalesOrderItem.TABLE_NAME)
  532.                 .add(" B ON A.so_item_id = B.so_item_id ")
  533.                 .add(" INNER JOIN ")
  534.                 .add(SalesOrder.TABLE_NAME)
  535.                 .add(" C ON B.so_id = C.so_id ")
  536.                 .add(" WHERE A.tenant_id = :tenantId ")
  537.                 .add(" AND A.ou_id = :ouId ")
  538.                 .add(" AND C.partner_bill_to_id = :partnerId ")
  539.                 .add(" AND A.status_item = :RELEASED ");
  540.        
  541.         Query queryOsSo = inventoryDao.createNativeQuery(builderOsSo.toString());
  542.        
  543.         queryOsSo.setParameter("tenantId", inputDto.getLong("tenantId"));
  544.         queryOsSo.setParameter("ouId", inputDto.getLong("ouId"));
  545.         queryOsSo.setParameter("partnerId", inputDto.getLong("partnerId"));
  546.         queryOsSo.setParameter("RELEASED", SalesConstantsForXcom.STATUS_DOC_RELEASED);
  547.        
  548.         Object osSoAmount = queryOsSo.getSingleResult();
  549.        
  550.         //over credit limit amount dikurangi dengan nilai SO yang belum di-DO
  551.         overCreditLimitAmount = overCreditLimitAmount.subtract(Double.valueOf(osSoAmount.toString()));
  552.  
  553.        
  554.         //Mendapatkan nilai SO yang belum APPROVED
  555.         QueryBuilder builderNotApprovedSo = new QueryBuilder();
  556.         builderNotApprovedSo.add(" SELECT COALESCE(SUM(A.qty_so * (A.gross_sell_price - A.discount_amount)), 0)")
  557.                 .add(" FROM ")
  558.                 .add(SalesOrderItem.TABLE_NAME)
  559.                 .add(" A ")
  560.                 .add(" INNER JOIN ")
  561.                 .add(SalesOrder.TABLE_NAME)
  562.                 .add(" B ON A.so_id = B.so_id ")
  563.                 .add(" WHERE B.tenant_id = :tenantId ")
  564.                 .add(" AND B.ou_id = :ouId ")
  565.                 .add(" AND B.partner_bill_to_id = :partnerId ")
  566.                 .add(" AND B.status_doc IN (:DRAFT, :IN_PROGRESS) ");
  567.        
  568.         Query queryNotApprovedSo = inventoryDao.createNativeQuery(builderNotApprovedSo.toString());
  569.        
  570.         queryNotApprovedSo.setParameter("tenantId", inputDto.getLong("tenantId"));
  571.         queryNotApprovedSo.setParameter("ouId", inputDto.getLong("ouId"));
  572.         queryNotApprovedSo.setParameter("partnerId", inputDto.getLong("partnerId"));
  573.         queryNotApprovedSo.setParameter("DRAFT", SalesConstants.DRAFT_TRANSACTION);
  574.         queryNotApprovedSo.setParameter("IN_PROGRESS", SalesConstants.IN_PROGRESS_TRANSACTION);
  575.        
  576.         Object notApprovedSoAmount = queryNotApprovedSo.getSingleResult();
  577.        
  578.         //over credit limit amount dikurangi dengan nilai SO yang belum APPROVED
  579.         overCreditLimitAmount = overCreditLimitAmount.subtract(Double.valueOf(notApprovedSoAmount.toString()));
  580.        
  581.        
  582.         // return query result
  583.         return new Dto().put("overCreditLimitAmount", overCreditLimitAmount.doubleValue());
  584.     }
  585.    
  586.     public static void main(String[] args) {
  587.         QueryBuilder builderTax = new QueryBuilder();
  588.         builderTax.add(" SELECT COALESCE(SUM(A.gov_tax_amount - A.payment_amount), 0) AS os_amount FROM ")
  589.                 .add(SalesConstantsForXcom.INVOICE_TAX_AR_BALANCE_TABLE_NAME)
  590.                 .add(" A INNER JOIN ")
  591.                 .add(SalesConstantsForXcom.INVOICE_AR_BALANCE_TABLE_NAME)
  592.                 .add(" B ON A.invoice_ar_balance_id = B.invoice_ar_balance_id ")  
  593.                 .add(" WHERE A.tenant_id = :tenantId ")
  594.                 .add(" AND A.ou_id = :ouId ")
  595.                 .add(" AND A.partner_id = :partnerId ")
  596.                 .add(" AND A.due_date BETWEEN :startDate AND :endDate ")
  597.                 .add(" AND A.flg_payment = :NO ");
  598.        
  599.         System.out.println(builderTax.toString());
  600.     }
  601. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement