Files
contractor/upload.cfm
T

188 lines
12 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<cfsetting showdebugoutput="no" enablecfoutputonly="true">
<cfheader name="Content-Type" value="application/json; charset=utf-8">
<cfheader name="Access-Control-Allow-Origin" value="*">
<cfheader name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS">
<cfheader name="Access-Control-Allow-Headers" value="Content-Type">
<cfif cgi.request_method EQ "OPTIONS">
<cfoutput>OK</cfoutput><cfabort>
</cfif>
<cfset result = {ok: false, error: "no file"}>
<cftry>
<cfset ct = cgi.http_content_type>
<!--- Form-encoded: filename=&data=&contract_id= (iframe) --->
<cfif structKeyExists(form, "filename") AND structKeyExists(form, "data")>
<cfset clientFile = form.filename>
<cfset originalBytes = form.data>
<cfset contractId = structKeyExists(form, "contract_id") ? form.contract_id : "">
<cfset mime = "application/octet-stream">
<cfset ext = listLast(clientFile, ".")>
<cfif ext EQ "pdf"><cfset mime = "application/pdf">
<cfelseif ext EQ "docx"><cfset mime = "application/vnd.openxmlformats-officedocument.wordprocessingml.document">
<cfelseif ext EQ "doc"><cfset mime = "application/msword">
<cfelseif ext EQ "zip"><cfset mime = "application/zip">
</cfif>
<cftransaction>
<cfif len(contractId)>
<cfquery name="oldD" datasource="baza">
SELECT s.id as sid, s.document_id FROM supplements s
JOIN documents d ON d.id = s.document_id
WHERE s.contract_id = <cfqueryparam value="#contractId#" cfsqltype="cf_sql_varchar">
AND d.filename = <cfqueryparam value="#clientFile#" cfsqltype="cf_sql_varchar">
</cfquery>
<cfif oldD.recordCount GT 0>
<cfquery datasource="baza">DELETE FROM supplements WHERE id = <cfqueryparam value="#oldD.sid#" cfsqltype="cf_sql_varchar"></cfquery>
<cfquery datasource="baza">DELETE FROM documents WHERE id = <cfqueryparam value="#oldD.document_id#" cfsqltype="cf_sql_varchar"></cfquery>
</cfif>
</cfif>
<cfquery datasource="baza">
INSERT INTO documents (filename, mime_type, original_bytes, status) VALUES (<cfqueryparam value="#clientFile#" cfsqltype="cf_sql_varchar">,<cfqueryparam value="#mime#" cfsqltype="cf_sql_varchar">,<cfqueryparam value="#originalBytes#" cfsqltype="cf_sql_varchar">,'uploaded')
</cfquery>
<cfquery name="doc" datasource="baza">
SELECT id FROM documents WHERE filename=<cfqueryparam value="#clientFile#" cfsqltype="cf_sql_varchar"> AND status='uploaded' ORDER BY created_at DESC LIMIT 1
</cfquery>
<cfif len(contractId)>
<cfset suppType = "additional">
<cfelse>
<cfquery datasource="baza">
INSERT INTO contracts (number, client) VALUES (<cfqueryparam value="б/н #dateFormat(now(),'yyyymmdd')#-#timeFormat(now(),'HHmm')#" cfsqltype="cf_sql_varchar">,'')
</cfquery>
<cfquery name="cid" datasource="baza">
SELECT id FROM contracts ORDER BY created_at DESC LIMIT 1
</cfquery>
<cfset contractId = cid.id>
<cfset suppType = "initial">
</cfif>
<cfquery datasource="baza">
INSERT INTO supplements (contract_id, document_id, type) VALUES (<cfqueryparam value="#contractId#" cfsqltype="cf_sql_varchar">,<cfqueryparam value="#doc.id#" cfsqltype="cf_sql_varchar">,<cfqueryparam value="#suppType#" cfsqltype="cf_sql_varchar">)
</cfquery>
</cftransaction>
<cfset result = {ok: true, contract_id: contractId, doc_id: doc.id, filename: clientFile, size: len(originalBytes)}>
<!--- JSON: {filename, data} или {files: [...]} --->
<cfelseif ct CONTAINS "application/json">
<cfset body = toString(getHttpRequestData().content)>
<cfset data = deserializeJSON(body)>
<cfif structKeyExists(data, "files") AND isArray(data.files)>
<cfset fileList = data.files>
<cfelseif structKeyExists(data, "filename")>
<cfset fileList = [data]>
<cfelse>
<cfset result = {ok: false, error: "JSON: filename required"}>
<cfoutput>#serializeJSON(result)#</cfoutput><cfabort>
</cfif>
<cfset contractId = structKeyExists(data, "contract_id") ? data.contract_id : "">
<!--- Фоновая обработка — мгновенный ответ --->
<cfset fileListJson = serializeJSON(fileList)>
<cfthread action="run" name="up_#createUUID()#" flj="#fileListJson#" cid="#contractId#">
<cfset var fileList = deserializeJSON(flj)>
<cfset var contractId = cid>
<cfloop array="#fileList#" index="var fdata">
<cftry>
<cfset var clientFile = fdata.filename>
<cfset var originalBytes = fdata.data>
<cfset var mime = "application/octet-stream">
<cfset var ext = listLast(clientFile, ".")>
<cfif ext EQ "pdf"><cfset mime = "application/pdf">
<cfelseif ext EQ "docx"><cfset mime = "application/vnd.openxmlformats-officedocument.wordprocessingml.document">
<cfelseif ext EQ "doc"><cfset mime = "application/msword">
<cfelseif ext EQ "zip"><cfset mime = "application/zip">
</cfif>
<cftransaction>
<cfif len(contractId)>
<cfquery name="var oldD" datasource="baza">
SELECT s.id as sid, s.document_id FROM supplements s
JOIN documents d ON d.id = s.document_id
WHERE s.contract_id = <cfqueryparam value="#contractId#" cfsqltype="cf_sql_varchar">
AND d.filename = <cfqueryparam value="#clientFile#" cfsqltype="cf_sql_varchar">
</cfquery>
<cfif oldD.recordCount GT 0>
<cfquery datasource="baza">DELETE FROM supplements WHERE id = <cfqueryparam value="#oldD.sid#" cfsqltype="cf_sql_varchar"></cfquery>
<cfquery datasource="baza">DELETE FROM documents WHERE id = <cfqueryparam value="#oldD.document_id#" cfsqltype="cf_sql_varchar"></cfquery>
</cfif>
</cfif>
<cfquery datasource="baza">
INSERT INTO documents (filename, mime_type, original_bytes, status)
VALUES (<cfqueryparam value="#clientFile#" cfsqltype="cf_sql_varchar">,<cfqueryparam value="#mime#" cfsqltype="cf_sql_varchar">,<cfqueryparam value="#originalBytes#" cfsqltype="cf_sql_varchar">,'uploaded')
</cfquery>
<cfquery name="var doc" datasource="baza">
SELECT id FROM documents WHERE filename=<cfqueryparam value="#clientFile#" cfsqltype="cf_sql_varchar"> AND status='uploaded' ORDER BY created_at DESC LIMIT 1
</cfquery>
<cfif len(contractId)>
<cfset var suppType = "additional">
<cfelse>
<cfquery datasource="baza">
INSERT INTO contracts (number, client) VALUES (<cfqueryparam value="б/н #dateFormat(now(),'yyyymmdd')#-#timeFormat(now(),'HHmm')#" cfsqltype="cf_sql_varchar">,'')
</cfquery>
<cfquery name="var nc" datasource="baza">
SELECT id FROM contracts ORDER BY created_at DESC LIMIT 1
</cfquery>
<cfset contractId = nc.id>
<cfset var suppType = "initial">
</cfif>
<cfquery datasource="baza">
INSERT INTO supplements (contract_id, document_id, type) VALUES (<cfqueryparam value="#contractId#" cfsqltype="cf_sql_varchar">,<cfqueryparam value="#doc.id#" cfsqltype="cf_sql_varchar">,<cfqueryparam value="#suppType#" cfsqltype="cf_sql_varchar">)
</cfquery>
</cftransaction>
<cfcatch></cfcatch>
</cftry>
</cfloop>
</cfthread>
<cfset result = {ok: true, count: arrayLen(fileList), contract_id: contractId}>
<!--- Multipart: curl -F --->
<cfelseif structKeyExists(form, "files") AND len(form.files)>
<cffile action="upload" fileField="files" destination="#getTempDirectory()#" nameConflict="makeUnique" result="upload">
<cffile action="readBinary" file="#upload.serverDirectory#/#upload.serverFile#" variable="fileBytes">
<cfset mime = "application/octet-stream">
<cfset ext = listLast(upload.clientFile, ".")>
<cfif ext EQ "pdf"><cfset mime = "application/pdf">
<cfelseif ext EQ "docx"><cfset mime = "application/vnd.openxmlformats-officedocument.wordprocessingml.document">
<cfelseif ext EQ "doc"><cfset mime = "application/msword">
<cfelseif ext EQ "zip"><cfset mime = "application/zip">
</cfif>
<cfset contractId = structKeyExists(form, "contract_id") ? form.contract_id : "">
<cftransaction>
<cfif len(contractId)>
<cfquery name="oldD" datasource="baza">
SELECT s.id as sid, s.document_id FROM supplements s
JOIN documents d ON d.id = s.document_id
WHERE s.contract_id = <cfqueryparam value="#contractId#" cfsqltype="cf_sql_varchar">
AND d.filename = <cfqueryparam value="#upload.clientFile#" cfsqltype="cf_sql_varchar">
</cfquery>
<cfif oldD.recordCount GT 0>
<cfquery datasource="baza">DELETE FROM supplements WHERE id = <cfqueryparam value="#oldD.sid#" cfsqltype="cf_sql_varchar"></cfquery>
<cfquery datasource="baza">DELETE FROM documents WHERE id = <cfqueryparam value="#oldD.document_id#" cfsqltype="cf_sql_varchar"></cfquery>
</cfif>
</cfif>
<cfquery datasource="baza">
INSERT INTO documents (filename, mime_type, original_bytes, status) VALUES (<cfqueryparam value="#upload.clientFile#" cfsqltype="cf_sql_varchar">,<cfqueryparam value="#mime#" cfsqltype="cf_sql_varchar">,<cfqueryparam value="#toBase64(fileBytes)#" cfsqltype="cf_sql_varchar">,'uploaded')
</cfquery>
<cfquery name="doc" datasource="baza">
SELECT id FROM documents WHERE filename=<cfqueryparam value="#upload.clientFile#" cfsqltype="cf_sql_varchar"> AND status='uploaded' ORDER BY created_at DESC LIMIT 1
</cfquery>
<cfif len(contractId)>
<cfset suppType = "additional">
<cfelse>
<cfquery datasource="baza">
INSERT INTO contracts (number, client) VALUES (<cfqueryparam value="б/н #dateFormat(now(),'yyyymmdd')#-#timeFormat(now(),'HHmm')#" cfsqltype="cf_sql_varchar">,'')
</cfquery>
<cfquery name="cid" datasource="baza">
SELECT id FROM contracts ORDER BY created_at DESC LIMIT 1
</cfquery>
<cfset contractId = cid.id>
<cfset suppType = "initial">
</cfif>
<cfquery datasource="baza">
INSERT INTO supplements (contract_id, document_id, type) VALUES (<cfqueryparam value="#contractId#" cfsqltype="cf_sql_varchar">,<cfqueryparam value="#doc.id#" cfsqltype="cf_sql_varchar">,<cfqueryparam value="#suppType#" cfsqltype="cf_sql_varchar">)
</cfquery>
</cftransaction>
<cfset result = {ok: true, contract_id: contractId, doc_id: doc.id, filename: upload.clientFile, size: upload.fileSize}>
</cfif>
<cfcatch>
<cfset result = {ok: false, error: cfcatch.message}>
</cfcatch>
</cftry>
<cfoutput>#serializeJSON(result)#</cfoutput>