flexbiz-server
Version:
Flexible Server
109 lines (94 loc) • 11.4 kB
JavaScript
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;