UNPKG

flexbiz-server

Version:

Flexible Server

109 lines (94 loc) 11.4 kB
const axios=require("axios"),moment=require("moment"),crypto=require("crypto"),{numberToWord}=require("./utils"); function generateEasyInvoiceToken($httpMethod_signatureRawData$$,$username$$,$password$$,$taxCode$$){const $timestamp$$=Math.floor(Date.now()/1E3).toString(),$nonce$$=crypto.randomUUID().replace(/-/g,"");$httpMethod_signatureRawData$$=`${$httpMethod_signatureRawData$$.toUpperCase()}${$timestamp$$}${$nonce$$}`;return`${crypto.createHash("md5").update($httpMethod_signatureRawData$$,"utf8").digest("base64")}:${$nonce$$}:${$timestamp$$}:${$username$$}:${$password$$}:${$taxCode$$}`} const exportInvoice=async($app$$,$ct$$,$check_data_url$$=!1)=>{if(!$app$$.easy_url_service||!$app$$.easy_user||!$app$$.easy_password)throw"Th\u00f4ng tin xu\u1ea5t ho\u00e1 \u0111\u01a1n ch\u01b0a \u0111\u01b0\u1ee3c khai b\u00e1o \u0111\u1ea7y \u0111\u1ee7";$ct$$.details=$ct$$.details||[];var $kh_pattern$$=await global.getModel("customer").findOne({id_app:$app$$._id,ma_kh:$ct$$.ma_kh})||{};await $ct$$.details.filter($d$$=>$d$$.ma_vt).asyncJoinModel2($app$$._id.toString(),"dmvt",{where:"ma_vt",fields:"ten_vt"}); let $taxBreak$$={};const $itemInfo$$=[];$ct$$.details.forEach(($detail_tien_ck$$,$index$$)=>{let $thue_suat$$=($detail_tien_ck$$.ma_thue?$detail_tien_ck$$.thue_suat:$ct$$.thue_suat)||0,$unitPrice$$=$detail_tien_ck$$.gia_ban_ct_nt,$quantity$$=$detail_tien_ck$$.sl_xuat,$itemTotalAmountAfterDiscount$$=$detail_tien_ck$$.tien_ct_nt-0,$taxAmount$$=Math.round($detail_tien_ck$$.tien_ct_nt*$thue_suat$$/100),$itemTotalAmountWithTax$$=$itemTotalAmountAfterDiscount$$+$taxAmount$$;a:{var $JSCompiler_inline_result$jscomp$0_taxPercentage_tien_ct_nt$$= $detail_tien_ck$$.tien_ct_nt;switch($detail_tien_ck$$.ma_thue||$ct$$.ma_thue){case "KT":$JSCompiler_inline_result$jscomp$0_taxPercentage_tien_ct_nt$$=$JSCompiler_inline_result$jscomp$0_taxPercentage_tien_ct_nt$$<0?void 0:-1;break a;case "KK":$JSCompiler_inline_result$jscomp$0_taxPercentage_tien_ct_nt$$=$JSCompiler_inline_result$jscomp$0_taxPercentage_tien_ct_nt$$<0?void 0:-2;break a;case "TK":$JSCompiler_inline_result$jscomp$0_taxPercentage_tien_ct_nt$$=$JSCompiler_inline_result$jscomp$0_taxPercentage_tien_ct_nt$$< 0?void 0:-3;break a;default:$JSCompiler_inline_result$jscomp$0_taxPercentage_tien_ct_nt$$=$thue_suat$$}}$taxBreak$$[$JSCompiler_inline_result$jscomp$0_taxPercentage_tien_ct_nt$$.toString()]?($taxBreak$$[$JSCompiler_inline_result$jscomp$0_taxPercentage_tien_ct_nt$$.toString()].t_tien+=$itemTotalAmountAfterDiscount$$,$taxBreak$$[$JSCompiler_inline_result$jscomp$0_taxPercentage_tien_ct_nt$$.toString()].t_thue+=$taxAmount$$,$taxBreak$$[$JSCompiler_inline_result$jscomp$0_taxPercentage_tien_ct_nt$$.toString()].t_tt+= $itemTotalAmountWithTax$$):$taxBreak$$[$JSCompiler_inline_result$jscomp$0_taxPercentage_tien_ct_nt$$.toString()]={t_tien:$itemTotalAmountAfterDiscount$$,t_thue:$taxAmount$$,t_tt:$itemTotalAmountWithTax$$};$itemInfo$$.push(` <Product> <Code>${$detail_tien_ck$$.ma_vt||"SP"}</Code> <No>${$index$$+1}</No> <Feature></Feature> <ProdName>${$detail_tien_ck$$.ten_vt_vat||$detail_tien_ck$$.ten_vt}</ProdName> <ProdUnit>${$detail_tien_ck$$.tien_ct_nt<0?"":$detail_tien_ck$$.ma_dvt}</ProdUnit> <ProdQuantity>${$quantity$$}</ProdQuantity> <ProdPrice>${$unitPrice$$}</ProdPrice> <Discount>${0}</Discount> <DiscountAmount>${0}</DiscountAmount> <Total>${$itemTotalAmountAfterDiscount$$}</Total> <VATRate>${$JSCompiler_inline_result$jscomp$0_taxPercentage_tien_ct_nt$$} </VATRate> <VATRateOther>${$JSCompiler_inline_result$jscomp$0_taxPercentage_tien_ct_nt$$==-3?$thue_suat$$:""}</VATRateOther> <VATAmount>${$taxAmount$$}</VATAmount> <Amount>${$itemTotalAmountWithTax$$}</Amount> </Product>`);$detail_tien_ck$$=0-$detail_tien_ck$$.tien_ck_nt;$index$$=Math.round($detail_tien_ck$$*Math.max($JSCompiler_inline_result$jscomp$0_taxPercentage_tien_ct_nt$$,0)/100,0);$detail_tien_ck$$!=0&&($taxBreak$$[$JSCompiler_inline_result$jscomp$0_taxPercentage_tien_ct_nt$$.toString()].t_tien+=$detail_tien_ck$$,$taxBreak$$[$JSCompiler_inline_result$jscomp$0_taxPercentage_tien_ct_nt$$.toString()].t_thue+=$index$$,$taxBreak$$[$JSCompiler_inline_result$jscomp$0_taxPercentage_tien_ct_nt$$.toString()].t_tt= $taxBreak$$[$JSCompiler_inline_result$jscomp$0_taxPercentage_tien_ct_nt$$.toString()].t_tt+$detail_tien_ck$$+$index$$,$itemInfo$$.push(` <Product> <Code>discount</Code> <No>${$ct$$.details.length}</No> <Feature></Feature> <ProdName>Chi\u1ebft kh\u1ea5u</ProdName> <ProdUnit></ProdUnit> <ProdQuantity></ProdQuantity> <ProdPrice></ProdPrice> <Discount>${0}</Discount> <DiscountAmount>${0}</DiscountAmount> <Total>${$detail_tien_ck$$}</Total> <VATRate>${$JSCompiler_inline_result$jscomp$0_taxPercentage_tien_ct_nt$$} </VATRate> <VATAmount>${$index$$}</VATAmount> <Amount>${$detail_tien_ck$$+$index$$}</Amount> </Product>`))});$ct$$.ngay_hd||($ct$$.ngay_hd=new Date);var $hinh_thuc_tt_so_seri$$=$ct$$.hinh_thuc_tt;$hinh_thuc_tt_so_seri$$=$hinh_thuc_tt_so_seri$$=="CK"?"Chuy\u1ec3n kho\u1ea3n":$hinh_thuc_tt_so_seri$$=="TM/CK"?"Ti\u1ec1n m\u1eb7t/Chuy\u1ec3n kho\u1ea3n":"Ti\u1ec1n m\u1eb7t";var $XmlData_data_t_tien$$=Object.values($taxBreak$$).map($v$$=>$v$$.t_tien).reduce(($a$$,$b$$)=>$a$$+$b$$,0);let $t_thue$$=Object.values($taxBreak$$).map($v$$=>$v$$.t_thue).reduce(($a$$,$b$$)=>$a$$+$b$$,0), $t_tt$$=Object.values($taxBreak$$).map($v$$=>$v$$.t_tt).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$XmlData_data_t_tien$$=` <Invoices> <Inv> <Invoice> <Ikey>${$ct$$._id.toString()}</Ikey> <CusCode>${$ct$$.ma_kh}</CusCode> <Buyer>${$ct$$.ong_ba||""}</Buyer> <CusName>${$ct$$.ten_kh||$kh_pattern$$.ten_kh} </CusName> <Email>${$kh_pattern$$.email||""}</Email> <EmailCC></EmailCC> <CusAddress>${$ct$$.dia_chi||$kh_pattern$$.dia_chi}</CusAddress> <CusBankName>${$ct$$.ten_ngan_hang||$kh_pattern$$.ten_ngan_hang||""}</CusBankName> <CusBankNo>${$ct$$.tk_ngan_hang||$kh_pattern$$.tk_ngan_hang||""}</CusBankNo> <CusPhone>${$ct$$.dien_thoai||$kh_pattern$$.dien_thoai||""}</CusPhone> <CusTaxCode>${$ct$$.ma_so_thue||$kh_pattern$$.ma_so_thue||""}</CusTaxCode> <PaymentMethod>${$hinh_thuc_tt_so_seri$$}</PaymentMethod> <ArisingDate>${moment($ct$$.ngay_hd).format("DD/MM/YYYY")}</ArisingDate> <ExchangeRate>${$ct$$.ty_gia}</ExchangeRate> <CurrencyUnit>${$ct$$.ma_nt}</CurrencyUnit> <Extra></Extra> <Products> ${$itemInfo$$.join("")} </Products> <Total>${$XmlData_data_t_tien$$}</Total> <VATAmount>${$t_thue$$}</VATAmount> <Amount>${$t_tt$$}</Amount> <GrossValue>${$taxBreak$$["-1"]?.t_tien||0}</GrossValue> <GrossValue0>${$taxBreak$$["0"]?.t_tien||0}</GrossValue0> <GrossValue5>${$taxBreak$$["5"]?.t_tien||0}</GrossValue5> <GrossValue10>${$taxBreak$$["10"]?.t_tien||0}</GrossValue10> <GrossValueNDeclared>${$taxBreak$$["-2"]?.t_tien||0}</GrossValueNDeclared> <GrossValueContractor>${$taxBreak$$["-3"]?.t_tien||0}</GrossValueContractor> <VatAmount0>${$taxBreak$$["0"]?.t_tien||0}</VatAmount0> <VatAmount5>${$taxBreak$$["5"]?.t_tien||0}</VatAmount5> <VatAmount10>${$taxBreak$$["10"]?.t_tien||0}</VatAmount10> <VatAmountNDeclared>${$taxBreak$$["-2"]?.t_tien||0}</VatAmountNDeclared> <VatAmountContractor>${$taxBreak$$["-3"]?.t_tien||0}</VatAmountContractor> <Amount0>${$taxBreak$$["0"]?.t_tt||0}</Amount0> <Amount5>${$taxBreak$$["5"]?.t_tt||0}</Amount5> <Amount10>${$taxBreak$$["10"]?.t_tt||0}</Amount10> <AmountNDeclared>${$taxBreak$$["-2"]?.t_tt||0}</AmountNDeclared> <AmountOther>${$taxBreak$$["-3"]?.t_tt||0}</AmountOther> <GrossValue8>${$taxBreak$$["8"]?.t_tien||0}</GrossValue8> <VatAmount8>${$taxBreak$$["8"]?.t_tien||0}</VatAmount8> <Amount8>${$taxBreak$$["8"]?.t_tt||0}</Amount8> <AmountInWords>${numberToWord($t_tt$$)} \u0111\u1ed3ng</AmountInWords> </Invoice> </Inv> </Invoices> `;$kh_pattern$$=$ct$$.ky_hieu_hoa_don||$app$$.easy_ky_hieu_hoa_don||"";$hinh_thuc_tt_so_seri$$=$ct$$.so_seri||$app$$.easy_so_serial||"";$XmlData_data_t_tien$$={XmlData:$XmlData_data_t_tien$$,Pattern:$kh_pattern$$,Serial:$hinh_thuc_tt_so_seri$$};if($check_data_url$$)return $XmlData_data_t_tien$$;$check_data_url$$=`${$app$$.easy_url_service.trim()}/api/publish/importInvoice`;try{let $data_rs$$=(await axios({method:"post",url:$check_data_url$$,headers:{Authentication:generateEasyInvoiceToken("POST", $app$$.easy_user,$app$$.easy_password,$app$$.ma_so_thue)},data:$XmlData_data_t_tien$$})).data;if($data_rs$$.Status==2){let $invoice$$=$data_rs$$.Data.Invoices[0];$invoice$$.invoiceNo=$invoice$$.No||"";return{result:$invoice$$,so_hd:$invoice$$.invoiceNo||"",ky_hieu_hoa_don:$kh_pattern$$,so_seri:$hinh_thuc_tt_so_seri$$}}throw $data_rs$$.Message;}catch($e$$){throw Logger.error("[utils] [exportInvoiceEasy] export invoice",$e$$.response?.data||$e$$.response||$e$$),Logger.error("check data:"),Logger.error(JSON.stringify($XmlData_data_t_tien$$, null,2)),$e$$.response?.data?.Data?.KeyInvoiceMsg||$e$$.response?.data?.Message||$e$$.message||$e$$||"Kh\u00f4ng th\u1ec3 xu\u1ea5t ho\u00e1 \u0111\u01a1n";}};exports.exportInvoice=exportInvoice; const getInvoice=async($app$$,$ikey$$)=>{if(!$app$$)throw"Thi\u1ebfu th\u00f4ng tin c\u00f4ng ty";if(!$app$$.easy_url_service||!$app$$.easy_user||!$app$$.easy_password)throw"Ch\u01b0a khai b\u00e1o th\u00f4ng tin k\u1ebft n\u1ed1i invoice";if(!$app$$.ma_so_thue)throw"Ch\u01b0a khai b\u00e1o m\u00e3 s\u1ed1 thu\u1ebf c\u00f4ng ty";let $url$$=`${$app$$.easy_url_service.trim()}/api/publish/getInvoicesByIkeys`;try{let $kq$$=(await axios({method:"post",url:$url$$,headers:{Authentication:generateEasyInvoiceToken("POST", $app$$.easy_user,$app$$.easy_password,$app$$.ma_so_thue)},data:{Ikeys:[$ikey$$]}})).data;if($kq$$.Status==2){if($kq$$.Invoices&&$kq$$.Invoices.length==1){let $invoice$$=$kq$$.Invoices[0];$invoice$$.invoiceNo=$invoice$$.No;return{result:$invoice$$}}return null}throw $kq$$.Message;}catch($e$$){if($e$$.response?.data?.ErrorCode==128||$e$$.response?.data?.ErrorCode==176)return null;Logger.error("[utils] [getInvoiceEasy] get invoice",$e$$.response?.data||$e$$.response||$e$$,", ikey:",$ikey$$,",url:",$url$$); throw(($e$$.response||{}).data||{}).Message||"Kh\u00f4ng th\u1ec3 l\u1ea5y th\u00f4ng tin ho\u00e1 \u0111\u01a1n n\u00e0y c\u1ee7a ikey "+$ikey$$;}};exports.getInvoice=getInvoice;