Evra70

proses_tukar_invoice

May 11th, 2020
364
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 13.44 KB | None | 0 0
  1. <?php
  2.  
  3. namespace Sts\CmsActivity\BO;
  4.  
  5. use App\Jobs\TukarTagihanSalesman;
  6. use DB;
  7. use GuzzleHttp\Client;
  8. use GuzzleHttp\Exception\RequestException;
  9. use Illuminate\Support\Carbon;
  10. use Log;
  11. use PDO;
  12. use Sts\CmsActivity\Model\InvoiceBalanceVisitPlanDetail;
  13. use Sts\CmsActivity\Model\SlInvoiceExchange;
  14. use Sts\CmsActivity\Model\SlInvoiceVisitPlan;
  15. use Sts\CmsCommon\Helpers\LogApiHelper;
  16. use Sts\PleafCore\BusinessTransaction;
  17. use Sts\PleafCore\CoreException;
  18. use Sts\PleafCore\DateUtil;
  19. use Sts\PleafCore\DefaultBusinessTransaction;
  20.  
  21. /**
  22.  * @author Bahar, 24/10/2019
  23.  * @in
  24.  *
  25.  * @out
  26.  */
  27.  
  28. class InvoiceExchangeCustomer extends DefaultBusinessTransaction implements BusinessTransaction
  29. {
  30.    
  31.     public function getDescription()
  32.     {
  33.         return "Add invoice exchange and Update data invoice";
  34.     }
  35.    
  36.     public function prepare($dto, $originalDto)
  37.     {
  38.  
  39.         $invoice_dto = $dto["invoice_item"];
  40.  
  41.         $isInvoiceExchange = \App::make("isInvoiceExchange");
  42.         $doc_no = self::generateDocNo();
  43.  
  44.         $input_isInvoiceExchange = [
  45.             "tenant_id" => $dto["tenant_id"],
  46.             "doc_no"    => $doc_no,
  47.             "doc_date"  => $dto["visit_date"]
  48.         ];
  49.  
  50.         $isInvoiceExchange_result = $isInvoiceExchange->execute($input_isInvoiceExchange);
  51.  
  52.         if($isInvoiceExchange_result["exists"]) {
  53.  
  54.             $this->errorBusinessValidation(["error_item" => "Anda telah melakukan tukar tagihan pada tanggal ".Carbon::parse($dto["visit_date"])->format('d-m-Y')]);
  55.         }
  56.        
  57.         foreach($invoice_dto as $value_dto) {
  58.            
  59.             $findSlInvoiceVisitPlanById = \App::make("findInvoiceVisitPlanById");
  60.            
  61.             $input_findSlInvoiceVisitPlanById = [
  62.                 "invoice_visit_plan_id"   => $value_dto["invoice_visit_plan_id"],
  63.             ];
  64.            
  65.             $findSlInvoiceVisitPlanById_result = $findSlInvoiceVisitPlanById->execute($input_findSlInvoiceVisitPlanById);
  66.            
  67.             if($findSlInvoiceVisitPlanById_result->status == 'E') {
  68.                 $this->errorBusinessValidation("invoice dengan nomor dokumen ".$findSlInvoiceVisitPlanById_result->doc_no." sudah di tukarkan");
  69.             }
  70.         }
  71.        
  72.         $findPartnerByUserId = \App::make("findPartnerByUserId");
  73.        
  74.         $input_findPartnerByUserId = [
  75.             "user_id"   => $dto["user_id"],
  76.         ];
  77.        
  78.         $findPartnerByUserId_result = $findPartnerByUserId->execute($input_findPartnerByUserId);
  79.        
  80.         $findAdminProcessVisitPlain = \App::make("findAdminProcessVisitPlain");
  81.        
  82.         $input_findAdminProcessVisitPlain = [
  83.             "tenant_id" => $dto["tenant_id"],
  84.             "employee_id" => $findPartnerByUserId_result->partner_id,
  85.             "start_date" => $dto["visit_date"]
  86.         ];
  87.        
  88.         $findAdminProcessVisitPlain_result = $findAdminProcessVisitPlain->execute($input_findAdminProcessVisitPlain);
  89.  
  90.         if($findAdminProcessVisitPlain_result->status_visit != "I") {
  91.             $this->errorBusinessValidation("Status Visit belum in progress");
  92.         }
  93.  
  94.         $findPlanSalesmanVisitPlanById = \App::make("findPlanSalesmanVisitPlanById");
  95.  
  96.         $input_findPlanSalesmanVisitPlanById = [
  97.             "salesman_visit_plan_id" => $dto["salesman_visit_plan_id"],
  98.         ];
  99.  
  100.         $findPlanSalesmanVisitPlanById_result = $findPlanSalesmanVisitPlanById->execute($input_findPlanSalesmanVisitPlanById);
  101.        
  102.         $dto["admin_process_visit_plan_id"] = $findAdminProcessVisitPlain_result->admin_process_visit_plan_id;
  103.         $dto["register_id"]                 = $findAdminProcessVisitPlain_result->register_id;
  104.         $dto["customer_id"]                 = $findPlanSalesmanVisitPlanById_result->customer_id;
  105.         $dto["employee_id"]                 = $findPartnerByUserId_result->partner_id;
  106.         $dto["doc_no"]                      = $doc_no;
  107.  
  108.         return $dto;
  109.     }
  110.    
  111.     public function process($dto, $originalDto)
  112.     {
  113.         Log::debug('Process BT InvoiceExchangeCustomer');
  114.  
  115.         $user_id        = $dto["user_id"];
  116.         $datetime       = DateUtil::dateTimeNow();
  117.         $invoice_item   = $dto["invoice_item"];
  118.        
  119.         $slInvoiceExchange                                  = new SlInvoiceExchange();
  120.         $slInvoiceExchange->tenant_id                       = $dto["tenant_id"];
  121.         $slInvoiceExchange->admin_process_visit_plan_id     = $dto["admin_process_visit_plan_id"];
  122.         $slInvoiceExchange->register_id                     = $dto["register_id"];
  123.         $slInvoiceExchange->customer_id                     = $dto["customer_id"];
  124.         $slInvoiceExchange->employee_id                     = $dto["employee_id"];
  125.         $slInvoiceExchange->salesman_visit_plan_id          = $dto["salesman_visit_plan_id"];
  126.         $slInvoiceExchange->salesman_visit_realization_id   = $dto["salesman_visit_realization_id"];
  127.         $slInvoiceExchange->doc_no                          = $dto["doc_no"];
  128.         $slInvoiceExchange->doc_date                        = $dto["visit_date"];
  129.         $slInvoiceExchange->curr_code                       = "IDR";
  130.         $slInvoiceExchange->ext_doc_no                      = $dto["ext_doc_no"];
  131.         $slInvoiceExchange->ext_doc_date                    = $dto["ext_doc_date"];
  132.         $slInvoiceExchange->due_date                        = $dto["due_date"];
  133.         $slInvoiceExchange->remark                          = $dto["remark"];
  134.         $slInvoiceExchange->status_doc                      = "R";
  135.        
  136.         self::auditInsert($slInvoiceExchange, $user_id, $datetime);
  137.        
  138.         $slInvoiceExchange->save();
  139.        
  140.         foreach($invoice_item as $item) {
  141.             $slInvoiceVisitPlan = SlInvoiceVisitPlan::find($item["invoice_visit_plan_id"]);
  142.            
  143. //            $slInvoiceVisitPlan->ref_id             = $slInvoiceExchange->invoice_exchange_id;
  144.             $slInvoiceVisitPlan->status             = "E";
  145.            
  146.             self::auditUpdate($slInvoiceVisitPlan, $user_id, $datetime);
  147.            
  148.             $slInvoiceVisitPlan->save();
  149.  
  150.             $invoiceBalanceVisitPlanDetail = new InvoiceBalanceVisitPlanDetail();
  151.             $invoiceBalanceVisitPlanDetail->tenant_id = $dto["tenant_id"];
  152.             $invoiceBalanceVisitPlanDetail->admin_process_visit_plan_id = $dto["admin_process_visit_plan_id"];
  153.             $invoiceBalanceVisitPlanDetail->register_id = $dto["register_id"];
  154.             $invoiceBalanceVisitPlanDetail->salesman_visit_plan_id = $dto["salesman_visit_plan_id"];
  155.             $invoiceBalanceVisitPlanDetail->salesman_visit_realization_id = $dto["salesman_visit_realization_id"];
  156.             $invoiceBalanceVisitPlanDetail->customer_id = $dto["customer_id"];
  157.             $invoiceBalanceVisitPlanDetail->employee_id = $dto["employee_id"];
  158.             $invoiceBalanceVisitPlanDetail->ref_id = $slInvoiceExchange->invoice_exchange_id;
  159.             $invoiceBalanceVisitPlanDetail->ref_invoice_id = $slInvoiceVisitPlan->invoice_visit_plan_id;
  160.             $invoiceBalanceVisitPlanDetail->invoice_ext_id = $slInvoiceVisitPlan->invoice_ext_id;
  161.             $invoiceBalanceVisitPlanDetail->doc_no = $slInvoiceExchange->doc_no;
  162.             $invoiceBalanceVisitPlanDetail->doc_date = $slInvoiceExchange->doc_date;
  163.             $invoiceBalanceVisitPlanDetail->invoice_doc_no = $slInvoiceVisitPlan->doc_no;
  164.             $invoiceBalanceVisitPlanDetail->invoice_doc_date = $slInvoiceVisitPlan->doc_date;
  165.             $invoiceBalanceVisitPlanDetail->flg_invoice = "E";
  166.             self::auditInsert($invoiceBalanceVisitPlanDetail, $user_id, $datetime);
  167.             $invoiceBalanceVisitPlanDetail->save();
  168.  
  169.         }
  170.  
  171.         $input_jobs = [
  172.             "invoice_exchange_id"   => $slInvoiceExchange->invoice_exchange_id,
  173.             "employee_id"           => $dto["employee_id"],
  174.             "visit_date"            => $dto["visit_date"],
  175.             "datetime"              => $datetime,
  176.         ];
  177.  
  178.         $outputCallApiExternal = $this->createCallApiExternal($input_jobs);
  179.  
  180.         if(!$outputCallApiExternal["success"]) {
  181.             throw new CoreException("ERROR_CALL_API_EXTERNAL", [], $outputCallApiExternal);
  182.         }
  183.  
  184.         $outputCallApiExternal["result"] = $slInvoiceExchange;
  185.  
  186.         return $outputCallApiExternal;
  187.  
  188.     }
  189.  
  190.     private function generateDocNo(){
  191.  
  192.         $datetime = new \DateTime();
  193.         $docPeriod = $datetime->format('ym');
  194.         $prefix = "TT";
  195.         $datatype = _DATATYPE_TUKAR_TAGIHAN;
  196.  
  197.         $pdo = DB::getPdo();
  198.         $stmt = $pdo->prepare("SELECT f_gen_autonum(?,?)");
  199.         $prefix = $prefix."/".$docPeriod."/";
  200.         $stmt->bindValue(1, $prefix, PDO::PARAM_STR);
  201.         $stmt->bindValue(2, $datatype, PDO::PARAM_STR);
  202.         $stmt->execute();
  203.         $returnFunc = $stmt->fetch(PDO::FETCH_ASSOC);
  204.         $stmt->closeCursor();
  205.         $autonum = $returnFunc['f_gen_autonum'];
  206.  
  207.         return $autonum;
  208.     }
  209.  
  210.     private function createCallApiExternal($data) {
  211.  
  212.         Log::info("[PROCESS] TukarTagihanCustomer ".DateUtil::dateTimeNow()." [PROCESS] ");
  213.  
  214.         $invoice_exchange   = self::getInvoiceExchange($data["invoice_exchange_id"]);
  215.         $invoice_list       = self::getInvoice($data["invoice_exchange_id"]);
  216.         $employee_code      = self::getEmployeeCode($data["employee_id"]);
  217.  
  218.         $jsonInput = [
  219.             "apikey"               => getenv("WISER_API_KEY"),
  220.             "employee_code"         => $employee_code[0]->partner_code,
  221.             "datetime"              => $data["datetime"],
  222.             "username"              => $employee_code[0]->partner_code,
  223.             "customer_code"         => $invoice_exchange[0]->customer_code,
  224.             "visit_date"            => $data["visit_date"],
  225.             "register_id"           => $invoice_exchange[0]->register_id,
  226.             "doc_no"                => $invoice_exchange[0]->doc_no,
  227.             "doc_date"              => $invoice_exchange[0]->doc_date,
  228.             "remark"                => $invoice_exchange[0]->remark,
  229.             "invoice_list"          => $invoice_list
  230.         ];
  231.  
  232.         $baseUrl = getenv("WISER_API_URL");
  233.         $url = $baseUrl."visit/tukartagihantoko";
  234.         $apiName = "Tukar Tagihan Toko";
  235.         $request_time = time();
  236.  
  237.         try {
  238.  
  239.             Log::info("URL Request: ".$url);
  240.             Log::debug("Request Json: ".json_encode($jsonInput));
  241.  
  242.             $client = new Client();
  243.             $response = $client->post($url, [
  244.                 'json' => $jsonInput
  245.             ]);
  246.  
  247.             Log::info("Result :");
  248.             Log::debug($response->getBody());
  249.  
  250.             $code = $response->getStatusCode();
  251.  
  252.             $body = json_decode($response->getBody());
  253.             $success = $body->success;
  254.  
  255.             if($success) {
  256.  
  257.                 $response = [
  258.                     "api_name" => $apiName,
  259.                     "url" => $url,
  260.                     "request_time" => $request_time,
  261.                     "json_input" => json_encode($jsonInput),
  262.                     "response_code" => $code,
  263.                     "response_output" => $response->getBody(),
  264.                     "success" => $success
  265.                 ];
  266.  
  267.             } else {
  268.  
  269.                 $response = [
  270.                     "api_name" => $apiName,
  271.                     "url" => $url,
  272.                     "request_time" => $request_time,
  273.                     "json_input" => json_encode($jsonInput),
  274.                     "response_code" => $code,
  275.                     "error_message" => $body->error_message,
  276.                     "response_output" => $response->getBody(),
  277.                     "success" => $success
  278.                 ];
  279.  
  280.             }
  281.  
  282.         } catch (\Exception $ex) {
  283.             Log::error(json_encode($ex->getMessage()));
  284.  
  285.             $response = [
  286.                 "api_name" => $apiName,
  287.                 "url" => $url,
  288.                 "request_time" => $request_time,
  289.                 "json_input" => json_encode($jsonInput),
  290.                 "response_code" => $ex->getCode(),
  291.                 "error_message" => $ex->getMessage(),
  292.                 "response_output" => $ex->getMessage(),
  293.                 "success" => false
  294.             ];
  295.  
  296.         }
  297.  
  298.         Log::info("[END-PROCESS] TukarTagihanCustomer ".DateUtil::dateTimeNow()." [END-PROCESS] ");
  299.  
  300.         return $response;
  301.  
  302.     }
  303.  
  304.     private function getInvoiceExchange($invoice_exchange_id) {
  305.  
  306.         $result = \DB::Select(" SELECT f_get_partner_code(customer_id) AS customer_code, register_id,
  307.       doc_no, doc_date, due_date, remark
  308.       FROM sl_invoice_exchange
  309.       WHERE invoice_exchange_id = $invoice_exchange_id; ");
  310.  
  311.         return $result;
  312.     }
  313.  
  314.     private function getInvoice($invoice_exchange_id) {
  315.  
  316.         $result = \DB::Select("
  317.            SELECT f_get_partner_code(A.customer_id) AS customer_code, A.register_id,
  318.               B.invoice_doc_no AS doc_no, B.invoice_doc_date AS doc_date, invoice_ext_id AS invoice_id
  319.           FROM sl_invoice_exchange A
  320.           INNER JOIN sl_invoice_balance_visit_plan_detail B ON A.invoice_exchange_id = B.ref_id AND B.flg_invoice = 'E'
  321.           WHERE A.invoice_exchange_id = $invoice_exchange_id;
  322.       ");
  323.  
  324.         return $result;
  325.     }
  326.  
  327.     private function getEmployeeCode($employee_id) {
  328.  
  329.         $result = \DB::Select(" SELECT partner_code FROM m_partner
  330.       WHERE partner_id = $employee_id; ");
  331.  
  332.         return $result;
  333.     }
  334.  
  335.  
  336. }
Add Comment
Please, Sign In to add comment